Java 的 Tuple 元组数据类型
元组类型,即 Tuple 常在脚本语言中出现,例如 Scala 的 ("Unmi", "china@qq.com", "blahbla")。元组可认为是象数组一样的容器,它的目的是让你方便构造和引用,例如 Pair 可认为是一个只能存两个元素的元组,像是个 Map; 真正的元组应该是可以任意多个元素的容器,绕来绕去,它还是数组,或列表,所以我们实现上还是要借助于数组或是列表。
先看 Scala 中什么是元组:
val tuple = ("Unmi", "fantasia@sina.com", "blahblah...")
println(tuple._1)  //输出 Unmi
Scala 中访问从 1 开始,用 ._1 方式来访问其中的元素。
场景:当在一个方法中, 你需要返回几个对象,这几个对象的类型一致,你可以返回一个数组;如果几个对象的类型不同呢,当然你可以返回一个Object[]数组,可是这样在使用结果数组的时候,就需要强转对象的类型,会导致类型不安全;也可以定义一个dto,当多个场景下需要使用的不同,需要定义多个dto,这样会类爆炸,而且重用率极低;在非常接近Java语言的Scala里有元组的定义:val t = (1, 3.14, "Fred"),就是一个不同类型的数据放到一个线性集合里,在Java里我们可以模拟出一个类似的结构,以适合上面的场景。
示例一:
参照于此,写出一个 Java 版本的 Tuple,为增长你的键盘的使用寿命,我们把方法名也缩短了,例如 make 缩写为 mk,引用元素的方法名为 _,仍然保持 Java 的习惯,索引从 0 开始:
package com.sf.tuple; /**
* A simple java tuple
*/
public class Tuple<A> { /**
* 静态方法
*
* @param args
* @return
*/
public static <A> Tuple mk(A... args) {
return new Tuple(args);
} private A[] items; /**
* 私有构造函数
*
* @param items
*/
private Tuple(A[] items) {
this.items = items;
} public A _(int index) {
if (index < 0 || items == null || index > items.length - 1) {
return null;
}
return items[index];
} public static void main(String[] args) {
Tuple<String> t = Tuple.mk("Unmi", "china@qq.com");
System.out.println(t._(0)); // 输出 Unmi
System.out.println(t._(1)); // 输出 china@qq.com
}
}
结果:
Unmi
china@qq.com
代码间加了一个 main 测试方法,上面的代码输出什么无需多说了。
这样就实现了 Tuple.mk() 后接任意多个参数来构造一个 Tuple 对象。
示例二:
package com.sf;
import com.google.common.base.Optional;
abstract class Tuple {  
    public static void main (String[] args) {
        Tuple tuple2 = Tuple.<String, Integer>of("hello", 1);
        Tuple tuple3 = Tuple.<String, Integer, String>of("hello", 1, "hi");
        System.out.println(tuple2._1().get() + "|" + tuple2._2().get());
        System.out.println(tuple3._1().get() + "|" + tuple3._2().get() + "|" + tuple3._3().get());  
    }  
    public static  <E, T> Tuple of (E e, T t) {
        return new Tuple2(e, t);
    }  
    public static  <E, T, K> Tuple of (E e, T t, K k) {
        return new Tuple3(e, t, k);
    }  
    public abstract <E> Optional<E> _1 ();  
    public abstract <E> Optional<E> _2 ();  
    public abstract <E> Optional<E> _3 ();  
}  
class Tuple2<E, T> extends Tuple {
    private E e;
    private T t;  
    Tuple2 (E e, T t) {
        this.e = e;
        this.t = t;
    }  
    @Override
    public Optional<E> _1 () {
        return Optional.of(e);
    }  
    @Override
    public Optional<T> _2 () {
        return Optional.of(t);
    }  
    @Override
    public <E> Optional<E> _3() {
        return Optional.absent();
    }
}  
class Tuple3<E, T, K> extends Tuple {
    private E e;
    private T t;
    private K k;  
    Tuple3 (E e, T t, K k) {
        this.e = e;
        this.t = t;
        this.k = k;
    }  
    public Optional<E> _1 () {
        return Optional.of(e);
    }  
    public Optional<T> _2 () {
        return Optional.of(t);
    }  
    public Optional<K> _3 () {
        return Optional.of(k);
    }
} 
结果:
hello|1
hello|1|hi
上面的代码中定义了三个类,父类为抽象类Tuple,此父类就是定义了一些模板方法,方法名有点不像Java方法名的命名规范,那是模仿scala里的方法命名,Tuple类没有其他作用,只是提供静态方法,创建Tuple的之类充当容器,提供多个容器的入口;
Tuple2<E,T>可以充当两个对象的容器,该容器内保持两个对象的引用,通过方法_1(), _2()获取第一个和第二个对象的值,在此并没有直接返回对象,而是返回一个Optional对象,这是提醒使用返回值的方法做非Null检查;
Tuple3<E,T,K>原理类似Tuple2,类似的可以做针对4个以及更多的对象容器,作为方法返回参数类型。
Java 的 Tuple 元组数据类型的更多相关文章
- python的tuple()元组数据类型的使用方法以及案例
		一.元组的概念介绍 1.元组是列表的二次加工 列表可以被修改 列表的类型 list li = [1,2,3,4,5,6] 2.元组的元素不可被修改,不能被增加或者删除,(只是针对元组的一级元素是不可以 ... 
- Python数据类型的内置函数之tuple(元组),dict(字典),set(集合)
		Python数据类型内置函数 - str(字符串) - list(列表) - tuple(元组) - dict(字典) - set(收集) tuple(元组)的操作 - (count)统计元组中元素出 ... 
- python入门到放弃-基本数据类型之tuple元组
		#概述 元组俗称不可变的列表,又称只读列表,是python的基本数据类型之一, 用()小括号表示,里面使用,逗号隔开 元组里面可以放任何的数据类型的数据,查询可以,循环可以,但是就是不能修改 #先来看 ... 
- Python - 基础数据类型 tuple 元组
		元组简单介绍 元组是一个和列表和相似的数据类型,也是一个有序序列 两者拥有着基本相同的特性,但是也有很多不同的地方 声明元组 var = (1, 2, 3) var = ("1", ... 
- Python  list  列表和tuple元组
		1 list是一种Python的数据类型--列表 list是一种有序的集合,可以进行增删改查 >>>name=[aa,bb,cc] >>>name ['aa','b ... 
- Tuple元组
		Tuple元组 Tuple 是 Storm 的主要数据结构,并且是 Storm 中使用的最基本单元.数据模型和元组. Tuple 描述 Tuple 就是一个值列表, Tuple 中的值可以是任何类型的 ... 
- Tuple元组 、 ValueTuple 值元组详解
		Tuple元组 Tuple是C# 4.0时出的新特性,.Net Framework 4.0以上版本可用. 元组是一种数据结构,具有特定数量和元素序列,与数组不同,元祖中的元素可以不同的数据类型.比如设 ... 
- list列表、tuple元组、range常用方法总结
		list 列表(数组),是可迭代对象,列表是可变的所以列表的方法都是在列表本身更改的.里面看可以放各种数据类型的数据,可存储大量数据 连接列表可以使用 + 或 extend() a = [1, 3, ... 
- C++11 tuple元组
		C++11 tuple 元组 tuple容器(元组), 是表示元组容器, 是不包含任何结构的,快速而低质(粗制滥造, quick and dirty)的, 可以用于函数返回多个返回值; tuple容器 ... 
随机推荐
- php建立一个空类: stdClass
			$pick = new stdClass; $pick->type = 'full'; ; 
- CentOS7.x 报错 There are no enabled repos.
			地址 :http://mirrors.163.com/centos/7/os/x86_64/Packages/ wget http://mirrors.163.com/centos/7/os/x8 ... 
- Android Studio实现代码混淆
			1,在build.grandle添加,其中规则写在proguard-rules.pro中,也可以自定义一个文件,将其代替,比如eclipse常用的 proguard-project.txt: bui ... 
- SAP初始账号
			方法1:有其中某Client的登录帐号1. 用已有帐号登录某个Client2. 运行Tcode SE303. 单击“tips and tricks“按钮4. 在Performance Tips an ... 
- Jquery的parent和parents(找到某一特定的祖先元素)用法(转发:https://blog.csdn.net/cui_angel/article/details/7903704)
			<!-- parent是指取得一个包含着所有匹配元素的唯一父元素的元素集合. parents则是取得一个包含着所有匹配元素的祖先元素的元素集合(不包含根元素).可以通过一个可选的表达式进行筛选. ... 
- python 的for else语句
			for中间不是break出来的,是正常循环完跳出循环的会执行else内的语句 while else语句也是如此 这个以前的常见语言没有,特此记录 
- js之语句的一些需要注意的事情
			1.delete运算符是用来删除一个对象的 属性,但有一点需要注意:使用var声明的变量虽为全局变量,单不是全局对象的属性,不可以用delete删除,而不用var直接声明的全局变量而直接赋值的为全局对 ... 
- 最新版本express 4.2.0的快速建站--简单举例
			express是Node.js的官方唯一推荐的框架,它扩展了http工具以及一些好用的功能.如此好用的东西,赶紧的安装起来: npm install express -g 新版本的express的命令 ... 
- EntityFramework 学习 一  Entity Framework  查询设计
			First/FirstOrDefault: using (var ctx = new SchoolDBEntities()) { var student = (from s in ctx.Studen ... 
- 分享知识-快乐自己:Liunx—Maven 部署步骤
			第一步: 点我下载 Liunx—Maven Linux命令下载:wget [下载文件存放路径] [下载文件地址] 第二步: 上传 Maven 并解压到 指定的目录:(上传方式 xftp 或 rz ... 
