轉載:Java元組類型之javatuples
關於方法的返回值,經常需要返回2個值或多個值的一個序列,比如數據表的一條記錄,文件的一行內容等。除了使用數組Array、集合(List、Set、Map)這些容器類型之外,在Java中我們就必須創建一個Class來作為返回類型。
在很多語言中都提供元組類型Tuple的支持,比如 .NET Framework 最多支持7個元素的元組,參考這里:
var population = new Tuple<string, int, int, int, int, int, int>( "New York", 7891957, 7781984, 7894862, 7071639, 7322564, 8008278);
Scala最多支持22個元素的元組,參考這里:
val t = new Tuple4(4,3,2,1) val t = (4,3,2,1) // syntactic sugar val sum = t._1 + t._2 + t._3 + t._4
C++(STL)的Tuple,參考這里:
tuple<int, string, string> t(5, "foo", "bar"); cout << t.get<1>(); // outputs "foo"
先看看Java中如果想返回“一個”鍵值對Pair,該怎么做?
(1)Apache Struts1的LabelValueBean
LabelValueBean lv = new LabelValueBean("rensanning.iteye.com", "9527");
(2)Guava的Maps.immutableEntry
Map.Entry<String,Integer> entry2 = Maps.immutableEntry("rensanning.iteye.com", 9527);
(3)Apache commons-collections的KeyValue
Map.Entry<String,Integer> entry3 = new DefaultMapEntry("rensanning.iteye.com", 9527); KeyValue<String,Integer> kv = new DefaultKeyValue("rensanning.iteye.com", 9527);
(4)Apache commons-lang3的Pair
1 Map.Entry<String,Integer> entry4 = new ImmutablePair<String, Integer>("rensanning.iteye.com", 9527);
(5)Apache HttpClient的NameValuePair
1 NameValuePair nv = new BasicNameValuePair("rensanning.iteye.com", "9527");
(6)Android的Pair
1 Pair<String, Integer> p = new Pair<String, Integer>("rensanning.iteye.com", 9527);
。。。。。。等等還有很多,你也可以自己擴展Map.Entry或者封裝Class。
Java 6提供AbstractMap.SimpleEntry<K,V>和AbstractMap.SimpleImmutableEntry<K,V>
1 Map.Entry<String,Integer> entry1 = new AbstractMap.SimpleEntry<String, Integer>("rensanning.iteye.com", 9527);
把這兩個Entity作為靜態來嵌入到標示為abstract的AbstractMap里,這個API給的是相當的奇怪!
javatuples是一個很簡單的lib,它沒有什么華麗的功能,就是提供了支持返回多個元素的一些類。
https://github.com/javatuples/javatuples
版本:javatuples-1.2.jar
最多支持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)
常用的2元組Pair:
- KeyValue<A,B>
- LabelValue<A,B>
1 // 1元組 2 Unit<String> u = new Unit<String>("rensanning.iteye.com"); 3 // 2元組 4 Pair<String,Integer> p = Pair.with("rensanning.iteye.com", 9527); 5 // 3元組 6 Triplet<String,Integer,Double> triplet = Triplet.with("rensanning.iteye.com", 9527, 1.0); 7 //... 8 9 KeyValue<String,String> kv = KeyValue.with("rensanning.iteye.com", "9527"); 10 LabelValue<String,String> lv = LabelValue.with("rensanning.iteye.com", "9527");
參考鏈接:
http://tech.puredanger.com/2010/03/31/do-we-want-a-java-util-pair/
http://mail.openjdk.java.net/pipermail/core-libs-dev/2010-March/003995.html