起因:在写java的时候,经常遇到函数需要返回2个值或者3个值,java必须编写一个Object,来封装,但很多应用场景只是临时使用,构建对象感觉杀鸡用宰牛刀,而其他语言有比较好的实现方法。(当然通过指针引用可以解决一部分问题)
如:一般写法:

public class Tt
{

public static void main(String[] args)
{
Tt t = new Tt();
User user = t.getUser();
long id = user.getId();
String name = user.getName();
// TODO .. do something
}

public User getUser()
{
// 测试
User user = new User();
user.setId(1L);
user.setName("hello");
return user;
}

class User
{
private long id;
private String name;

public long getId()
{
return id;
}

public void setId(long id)
{
this.id = id;
}

public String getName()
{
return name;
}

public void setName(String name)
{
this.name = name;
}
}
}

使用Tuple来实现:

public class Tt
{

public static void main(String[] args)
{
Tt t = new Tt();
Tuple2<Long, String> user = t.getUser();
long id = user._1();
String name = user._2();
// TODO ..do something
}


private Tuple2<Long, String> getUser()
{
long id = 1L;
String name = "hello";
return Tuple.tuple(id, name);
}
}

Tuple类:
import java.io.Serializable;


public abstract class Tuple implements Serializable
{


/** *//**
* gen by eclipse
*/
private static final long serialVersionUID = -8719929625763890308L;


public static <A, B> Tuple2<A, B> tuple(A a, B b)
{
return new Tuple2<A, B>(a, b);
}


public static <A, B, C, D, E> Tuple3<A, B, C> tuple(A a, B b, C c)
{
return new Tuple3<A, B, C>(a, b, c);
}


public static final class Tuple2<A, B> extends Tuple implements Serializable
{


/** *//**
* gen by eclipse
*/
private static final long serialVersionUID = 7263645006696591635L;
private A a;
private B b;


private Tuple2(A a, B b)
{
this.a = a;
this.b = b;
}


public A _1()
{
return this.a;
}


public B _2()
{
return this.b;
}
}


public static final class Tuple3<A, B, C> extends Tuple implements Serializable
{


/** *//**
* gen by eclipse
*/
private static final long serialVersionUID = 482545776907024160L;

private A a;
private B b;
private C c;


private Tuple3(A a, B b, C c)
{
this.a = a;
this.b = b;
this.c = c;
}


public A _1()
{
return this.a;
}


public B _2()
{
return this.b;
}


public C _3()
{
return this.c;
}
}
}

note: 1、这里只是写了2,3,如果有需要直接扩展实现就可以了
2、这里的Tuple类其实没多大用处,都可以直接使用Tuple2, Tuple3,但为了方便统一从Tuple入口出去,创建了静态方法。这样写更具扩展性。
Tuple:
用来表示一组单独的数据,比如数据库中的一条记录;这一点很好理解哈,Tuple的每个Item就像一条记录的每个字段。
当我们希望函数返回多个值的时