元组可以看成是一个容器,里面包含了很多的对象,这些对象可以是不同类型的。
有时候,我们需要一个函数返回很多个值的时候,可以用元组的办法来实现。可以定义一个类,将需要返回的对象设为该类的属性,然后把这个类的实例化对象返回。这种方法的一个缺点是,由于返回的对象的类型是不固定的,你不知道返回的是什么样的类型,如果对每一个方法都重新定义一个类的话,会导致代码臃肿。所幸的是,使用泛型可以解决这样的问题。
另一个问题在于,不同函数的返回值的个数不一样。这个时候,可以通过继承的机制扩展元组的容器的长度。
代码示例
/* * 只有两个对象的元组 */ class TwoTuple<K,V>{ public final K fst; public final V snd; TwoTuple(K k, V v){ fst = k; snd = v; } } /* * 三个元素的元组 */ class ThreeTuple<K,V,T> extends TwoTuple<K,V>{ public final T third; public ThreeTuple(K k,V v,T t) { super(k,v); third = t; } }
Java语言中本身不支持元组,因此我们需要自己定义类来实现元组,这样子其实挺麻烦的。下面介绍一个第三方的Java元组库类库,名称叫做Javatuples,有自己的官方主页, github star数也有几百,在Java元组库领域差不多起着垄断的地位了。
Javatuplets中定义的元组最大长度为10,元组类的定义如下
Unit<A> (1 element) Pair<A,B> (2 elements) Triplet<A,B,C> (3 elements) Quartet<A,B,C,D> (4 elements) Quintet<A,B,C,D,E> (5 elements) Sextet<A,B,C,D,E,F> (6 elements) Septet<A,B,C,D,E,F,G> (7 elements) Octet<A,B,C,D,E,F,G,H> (8 elements) Ennead<A,B,C,D,E,F,G,H,I> (9 elements) Decade<A,B,C,D,E,F,G,H,I,J> (10 elements)
使用示例
Triplet<String,Integer,Boolean> triplet = new Triplet<>("hello",33,true);
需要注意的是:
(1)尖括号里面的数据的类型不能是基本数据类型,如果需要使用到基本数据类型的话,需要用对应的包装类,如int转换为Integer, boolean转化为Boolean
(2)长度为2的元组Pair和javafx.util.*提供的Pair是不一样的。在元组里,各个对象是没有关系的,但是在javafx.util.*提供的Pair里,两个对象是绑定的,第一个对象是Key,第二个是Value,可以把后者看作是Map的一个元素