元组类型,即 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 元组数据类型的更多相关文章

  1. python的tuple()元组数据类型的使用方法以及案例

    一.元组的概念介绍 1.元组是列表的二次加工 列表可以被修改 列表的类型 list li = [1,2,3,4,5,6] 2.元组的元素不可被修改,不能被增加或者删除,(只是针对元组的一级元素是不可以 ...

  2. Python数据类型的内置函数之tuple(元组),dict(字典),set(集合)

    Python数据类型内置函数 - str(字符串) - list(列表) - tuple(元组) - dict(字典) - set(收集) tuple(元组)的操作 - (count)统计元组中元素出 ...

  3. python入门到放弃-基本数据类型之tuple元组

    #概述 元组俗称不可变的列表,又称只读列表,是python的基本数据类型之一, 用()小括号表示,里面使用,逗号隔开 元组里面可以放任何的数据类型的数据,查询可以,循环可以,但是就是不能修改 #先来看 ...

  4. Python - 基础数据类型 tuple 元组

    元组简单介绍 元组是一个和列表和相似的数据类型,也是一个有序序列 两者拥有着基本相同的特性,但是也有很多不同的地方 声明元组 var = (1, 2, 3) var = ("1", ...

  5. Python list 列表和tuple元组

    1 list是一种Python的数据类型--列表 list是一种有序的集合,可以进行增删改查 >>>name=[aa,bb,cc] >>>name ['aa','b ...

  6. Tuple元组

    Tuple元组 Tuple 是 Storm 的主要数据结构,并且是 Storm 中使用的最基本单元.数据模型和元组. Tuple 描述 Tuple 就是一个值列表, Tuple 中的值可以是任何类型的 ...

  7. Tuple元组 、 ValueTuple 值元组详解

    Tuple元组 Tuple是C# 4.0时出的新特性,.Net Framework 4.0以上版本可用. 元组是一种数据结构,具有特定数量和元素序列,与数组不同,元祖中的元素可以不同的数据类型.比如设 ...

  8. list列表、tuple元组、range常用方法总结

    list 列表(数组),是可迭代对象,列表是可变的所以列表的方法都是在列表本身更改的.里面看可以放各种数据类型的数据,可存储大量数据 连接列表可以使用 + 或 extend() a = [1, 3, ...

  9. C++11 tuple元组

    C++11 tuple 元组 tuple容器(元组), 是表示元组容器, 是不包含任何结构的,快速而低质(粗制滥造, quick and dirty)的, 可以用于函数返回多个返回值; tuple容器 ...

随机推荐

  1. php建立一个空类: stdClass

    $pick = new stdClass; $pick->type = 'full'; ;

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

  3. Android Studio实现代码混淆

     1,在build.grandle添加,其中规则写在proguard-rules.pro中,也可以自定义一个文件,将其代替,比如eclipse常用的 proguard-project.txt: bui ...

  4. SAP初始账号

     方法1:有其中某Client的登录帐号1. 用已有帐号登录某个Client2. 运行Tcode SE303. 单击“tips and tricks“按钮4. 在Performance Tips an ...

  5. Jquery的parent和parents(找到某一特定的祖先元素)用法(转发:https://blog.csdn.net/cui_angel/article/details/7903704)

    <!-- parent是指取得一个包含着所有匹配元素的唯一父元素的元素集合. parents则是取得一个包含着所有匹配元素的祖先元素的元素集合(不包含根元素).可以通过一个可选的表达式进行筛选. ...

  6. python 的for else语句

    for中间不是break出来的,是正常循环完跳出循环的会执行else内的语句 while else语句也是如此 这个以前的常见语言没有,特此记录

  7. js之语句的一些需要注意的事情

    1.delete运算符是用来删除一个对象的 属性,但有一点需要注意:使用var声明的变量虽为全局变量,单不是全局对象的属性,不可以用delete删除,而不用var直接声明的全局变量而直接赋值的为全局对 ...

  8. 最新版本express 4.2.0的快速建站--简单举例

    express是Node.js的官方唯一推荐的框架,它扩展了http工具以及一些好用的功能.如此好用的东西,赶紧的安装起来: npm install express -g 新版本的express的命令 ...

  9. EntityFramework 学习 一 Entity Framework 查询设计

    First/FirstOrDefault: using (var ctx = new SchoolDBEntities()) { var student = (from s in ctx.Studen ...

  10. 分享知识-快乐自己:Liunx—Maven 部署步骤

    第一步: 点我下载 Liunx—Maven Linux命令下载:wget [下载文件存放路径]   [下载文件地址] 第二步: 上传 Maven 并解压到 指定的目录:(上传方式 xftp 或 rz ...