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 ...