WHY?
通常情况下,一个方法返回值是一个,类型固定(当然你要封装成对象就另一说了)。如果想要在一个方法中返回多个类型不同的值(不要封装成对象)?这个时候就可以使用元组。典型的需求场景处理数据分页问题时。例如,在Web应用中,当需要查询分页数据时,通常需要返回当前页的数据记录(通常是一个列表)和总记录数(一个整数)。通过在一次数据库查询中同时获取这两个值,可以避免进行额外的数据库连接,从而提高效率。
WHAT?
Tuple通过泛型实现,允许存储不同数据类型的元素,并且这些元素的值之间没有关联。
元组和列表list区别:
二者都可能用于数据存储,包含多个数据
元组和列表不同的是:列表只能存储相同的数据类型;而元组可以存储不同的数据类型,比如同时存储Integer、String、List、Map、Object等,并且可以根据需求无限扩展。
总结一下:
① 元组不同于List,List存储相同的数据类型,虽然也可以存储不同的数据类型,那就不符合泛型了
② 元组不同于数组,数组种存储的相同的数据类型
③ 元组不同于Map,Map是Key-Value,而元组中的值与值之间没有关系
④ 元组的值可以是不同数据类型,值与值之间没有关系
DO?
方式1:三方类库
引入依赖jar包
<dependency>
<groupId>com.github.phantomthief</groupId>
<artifactId>more-lambdas</artifactId>
<version>0.1.55</version>
</dependency>
示例:
public static void main(String[] args) {
ThreeTuple<String, Integer, Integer> threeTuple = Tuple.tuple("123", 1, 2);
List<String> list = Arrays.asList("这是第1个字符串", "这是第2个字符串", "这是第3个字符串");
TwoTuple<List<String>, Integer> twoTuple1 = Tuple.tuple(list, list.size());
List<String> first = twoTuple1.first;
Integer second = twoTuple1.second;
System.out.println(first);
System.out.println(second);
}
方式2:自定义元组
这种方式和定义对象一样,只不过需要使用泛型来保证接受各类数据。
二元组类
public class TwoTuple<A, B> {
public final A first;
public final B second;
public TwoTuple(final A a, final B b) {
this.first = a;
this.second = b;
}
public A getFirst() {
return first;
}
public B getSecond() {
return second;
}
}
三元组类
public class ThreeTuple<A, B, C> extends TwoTuple<A, B> {
public final C third;
public ThreeTuple(A a, B b, C c) {
super(a, b);
this.third = c;
}
public C getThird() {
return third;
}
}
工具类:
public class TupleUtil {
public static <A, B> TwoTuple<A, B> tuple(final A a, final B b) {
return new TwoTuple<A, B>(a, b);
}
public static <A, B, C> ThreeTuple<A, B, C> tuple(final A a, final B b, final C c) {
return new ThreeTuple<A, B, C>(a, b, c);
}
}
Demo方法
public static void main(String[] args) {
ThreeTuple<String, Double, Integer> threeTuple = TupleUtil.tuple("自定义2元组", 123.456, 789);
System.out.println("3元组first: " + threeTuple.first);
System.out.println("3元组second: " + threeTuple.second);
System.out.println("3元组third: " + threeTuple.third);
List<String> list = Arrays.asList("这是第1个字符串", "这是第2个字符串", "这是第3个字符串");
TwoTuple<List<String>, Integer> twoTuple = TupleUtil.tuple(list, list.size());
System.out.println("2元组first: " + twoTuple.first);
System.out.println("2元组second: " + twoTuple.second);
}