转载: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", , ,
, , , );

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(, "foo", "bar");
cout << t.get<>(); // 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

 Map.Entry<String,Integer> entry4 = new ImmutablePair<String, Integer>("rensanning.iteye.com", 9527);  

(5)Apache HttpClient的NameValuePair

 NameValuePair nv = new BasicNameValuePair("rensanning.iteye.com", "9527");  

(6)Android的Pair

 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>

 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元组
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");

参考链接: 
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

Java元组类型之javatuples的更多相关文章

  1. 在Java中使用元组类型的利器

    Java本身并没有内置元组这一项特性,要使用元组必须自行实现,所幸现在这些编程语言都支持泛型, 实现非内置元组也变的异常简单, 但是毕竟是非语言内置的语法元素,使用起来肯定不如原生元组来的便捷. 下面 ...

  2. Python编程Day6——元组类型、字典类型、集合

    一.元组类型(tuple) 1.用途:记录多个值,当多个值没有改变的需求此时元组更为合适 2.定义:在()内用逗号分隔开多个任意类型的值(参数为for可以循环的对象) 3.常用操作: 索引(正取向+反 ...

  3. iOS开发Swift篇—(五)元组类型

    iOS开发Swift篇—(五)元组类型 一.元组类型介绍 1.什么是元组类型 元组类型由 N个 任意类型的数据组成(N >= 0),组成元组类型的数据可以称为“元素” 示例: let posit ...

  4. java string类型的初始化

    以下基本上是java string类型最常用的三种方法 new string()就不介绍了  基本等同于第三种 String a;  申明一个string类型的 a,即没有在申请内存地址,更没有在内存 ...

  5. java 枚举类型分析

    最近做android开发,需要用到枚举值,这样可以连续赋值,我按之前c++那样书写,如下所示: public enum ColorSelect { RED_BAGE = 0, GREEN_BAGE, ...

  6. java double类型保留两位小数4种方法【转】

    4种方法,都是四舍五入,例: import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberF ...

  7. 【转】java枚举类型enum的使用

    原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 ...

  8. swift-06-字符串,字符以及元组类型

    1.字符串和字符类型 //在swift中,字符串使用一对双引号括起来 var str = "hello M.SD-DJ" print(str) //字符也要用双引号括起来,用cha ...

  9. swift之元组类型

    一.元组类型是有N个任意类型的数据组成(N>=0),组成元组类型的数据可以称为“元素” 二.元组的定义 如:let position = (x:10.5,y:20)    //两个元素的元组 l ...

随机推荐

  1. ASP.NET 日期 时间 年 月 日 时 分 秒 格式及转换

    在平时编码中,经常要把日期转换成各种各样的形式输出或保持,今天专门做了个测试,发现DateTime的ToString()方法居然有这么多的表现形式,和大家一起分享. DateTime time=Dat ...

  2. 为什么你写的Python运行的那么慢呢?

    大约在一年前,也就是2013年在Waza(地名),Alex Gaynor提到了一个很好的话题:为什么用Python.Ruby和Javascript写的程序总是运行的很慢呢?正如他强调的,关键就是现在出 ...

  3. My implementation of AVL tree

    C++实现的avl平衡树 #include <stdlib.h> #include <time.h> #include <string.h> #include &l ...

  4. CDH5.5.1 安装Spark ON Yarn环境

    CDH对我们已经封装了,我们如果需要Spark on Yarn,只需要yum安装几个包就可以了. 前面的文章我有写过如果搭建自己内网的CDH Yum服务器,请参考<CDH 5.5.1 Yum源服 ...

  5. java console ( mac osx ) 命令行编码

    方法 vi ~/.bash_profile #添加新行, UTF-8表示你平台的编码方式 #例如你是GBK.GB18030的 #替换成你平台console可现实字符编码即可 export JAVA_T ...

  6. MySQL存储过程权限分析

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://huanghualiang.blog.51cto.com/6782683/1216 ...

  7. Oracle 表数据去重

    Oracle数据库中重复数据怎么去除?使用数据表的时候经常会出现重复的数据,那么要怎么删除呢?下面我们就来说一说去除Oracle数据库重复数据的问题.今天我们要说的有两种方法. 一.根据rowid来去 ...

  8. jquery easyui防止超出浏览器边界

    var easyuiPanelOnMove=function(left,top){ if(left<0){ $(this).window('move',{ left:1 }); } if(top ...

  9. codeforces 630F Selection of Personnel(组合数)

    F. Selection of Personnel time limit per test 0.5 seconds memory limit per test 64 megabytes input s ...

  10. linux(centos 6)下记录所有用户的操作以及ip、时间

    编辑/etc/profile文件,在文件末尾加入下面代码: [root@iZ23nn1p4mjZ root]# vi /etc/profile history USER=`whoami` USER_I ...