Java元组的理解和使用

元组可以看成是一个容器,里面包含了很多的对象,这些对象可以是不同类型的。

有时候,我们需要一个函数返回很多个值的时候,可以用元组的办法来实现。可以定义一个类,将需要返回的对象设为该类的属性,然后把这个类的实例化对象返回。这种方法的一个缺点是,由于返回的对象的类型是不固定的,你不知道返回的是什么样的类型,如果对每一个方法都重新定义一个类的话,会导致代码臃肿。所幸的是,使用泛型可以解决这样的问题。

 

另一个问题在于,不同函数的返回值的个数不一样。这个时候,可以通过继承的机制扩展元组的容器的长度。

代码示例

/*
* 只有两个对象的元组
*/
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的一个元素

 

posted @ 2019-10-27 16:49  ShangyiChen  阅读(1713)  评论(0编辑  收藏  举报