Java元组类型之javatuples

关于方法的返回值,经常需要返回2个值或多个值的一个序列,比如数据表的一条记录,文件的一行内容等。除了使用数组Array、集合(List、Set、Map)这些容器类型之外,在Java中我们就必须创建一个Class来作为返回类型。

在很多语言中都提供元组类型Tuple的支持,比如 .NET Framework 最多支持7个元素的元组,[url=http://technet.microsoft.com/zh-cn/library/system.tuple(v=vs.95)]参考这里[/url]:
var population = new Tuple<string, int, int, int, int, int, int>(
"New York", 7891957, 7781984,
7894862, 7071639, 7322564, 8008278);


Scala最多支持22个元素的元组,[url=http://www.scala-lang.org/api/current/index.html#scala.Tuple22]参考这里[/url]:
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,[url=http://www.cplusplus.com/reference/tuple/]参考这里[/url]:
tuple<int, string, string> t(5, "foo", "bar");
cout << t.get<1>(); // outputs "foo"


先看看Java中如果想返回“一个”键值对Pair,该怎么做?

(1)Apache Struts1的[url=http://struts.apache.org/release/1.3.x/apidocs/org/apache/struts/util/LabelValueBean.html]LabelValueBean[/url]
LabelValueBean lv = new LabelValueBean("rensanning.iteye.com", "9527");


(2)Guava的[url=http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Maps.html#immutableEntry%28K,%20V%29]Maps.immutableEntry[/url]
Map.Entry<String,Integer> entry2 = Maps.immutableEntry("rensanning.iteye.com", 9527);


(3)Apache commons-collections的[url=http://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/KeyValue.html]KeyValue[/url]
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的[url=http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/tuple/Pair.html]Pair[/url]
Map.Entry<String,Integer> entry4 = new ImmutablePair<String, Integer>("rensanning.iteye.com", 9527);


(5)Apache HttpClient的[url=https://hc.apache.org/httpcomponents-core-4.3.x/httpcore/apidocs/org/apache/http/NameValuePair.html]NameValuePair[/url]
NameValuePair nv = new BasicNameValuePair("rensanning.iteye.com", "9527");


(6)Android的[url=http://developer.android.com/reference/android/util/Pair.html]Pair[/url]
Pair<String, Integer> p = new Pair<String, Integer>("rensanning.iteye.com", 9527);


。。。。。。等等还有很多,你也可以自己扩展Map.Entry或者封装Class。

Java 6提供[url=http://docs.oracle.com/javase/7/docs/api/java/util/AbstractMap.html]AbstractMap.SimpleEntry<K,V>和AbstractMap.SimpleImmutableEntry<K,V>[/url]
Map.Entry<String,Integer> entry1 = new AbstractMap.SimpleEntry<String, Integer>("rensanning.iteye.com", 9527);

把这两个Entity作为静态来嵌入到标示为abstract的AbstractMap里,这个API给的是相当的奇怪!

javatuples是一个很简单的lib,它没有什么华丽的功能,就是提供了支持返回多个元素的一些类。

[url=https://github.com/javatuples/javatuples]https://github.com/javatuples/javatuples[/url]

版本:javatuples-1.2.jar

最多支持10个元素:
[list][*]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)[/list]

常用的2元组Pair:
[list][*]KeyValue<A,B>
[*]LabelValue<A,B>[/list]

// 1元组
Unit<String> u = new Unit<String>("rensanning.iteye.com");
// 2元组
Pair<String,Integer> p = Pair.with("rensanning.iteye.com", 9527);
// 3元组
Triplet<String,Integer,Double> triplet = Triplet.with("rensanning.iteye.com", 9527, 1.0);
//...

KeyValue<String,String> kv = KeyValue.with("rensanning.iteye.com", "9527");
LabelValue<String,String> lv = LabelValue.with("rensanning.iteye.com", "9527");


参考:
[url=http://tech.puredanger.com/2010/03/31/do-we-want-a-java-util-pair/]http://tech.puredanger.com/2010/03/31/do-we-want-a-java-util-pair/[/url]
[url=http://mail.openjdk.java.net/pipermail/core-libs-dev/2010-March/003995.html]http://mail.openjdk.java.net/pipermail/core-libs-dev/2010-March/003995.html[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值