元组在计算机领域有着特殊的意义,这个名字听起来似乎有些陌生, 平时在写代码也基本没什么应用场景, 然而, 出人意料的是, 元组跟程序设计密切相关, 可能有的同学不知道, 关系数据库中的「纪录」的另一个学术性的名称就是「元组」, 一条记录就是一个元组, 一个表就是一个关系, 纪录组成表, 元组生成关系, 这就是关系数据库的核心理念。

元组是关系数据库不可脱离的部份, 但是在程序设计中, 元组并不显得那么不可或缺。 有一些编程语言本身就自带元组的语法, 比如说python、F#、haskell、scala等,另一些更为流行的编程语言却不带元组语法, 如Java、JavaScript、c++、c#等。

元组并不像数组、对象那样是不可缺少的编程元素,但是, 使用它却能对编写代码带来很多的便利,尤其是当一个函数需要返回多个值的情况下。对于这种情况, 普遍的做法是定义一个对象,把函数需要返回的值作为对象的属性设置,然后把函数的返回值类型设为这个对象的类型, 函数直接返回这个对象就相当于返回多个值了。或者可以让这个函数返回一个map数据结构,具体的数据存在这个map里面。 然而, 这两种做法各有缺陷, 第一种方法虽然可靠, 然而代码会显的异常臃肿。需求本身很简单, 只要让函数返回多个值 , 然而用这种方法却需要事先定义好一个类型, 然后再实例化,再设置实例属性, 最后返回, 这样做的编码效率也未免太低了些。 第二种方法虽然快捷,却不够安全, 在函数的内部或许知道map里存储着什么样的值, 然而在函数外部, 却只知道这个函数的返回值是一个map,至于map里面存有哪些值,是什么类型都是一无所知的, 在多人开发的项目中这种弊端尤其明显 ,可悲的是这种做法在一些动态类型的语言中是首选的方案,这也是动态类型语言被吐槽安全性、可读性差的根本原因之一。 因此, 解决这类问题最好的方案就是使用元组。

在语法本身支持元组的语言中, 元组是用括号表示的,如(int,bool,string)就是一个三元组类型, 它的值可以是(1,true,"abc")。 需要注意是的每一个元组类型都是唯一的, (int,bool),(bool,int),(string,double)虽然都是二元组, 然而它们却是不同的元组, 假如把这里的某一个元组作为函数的返回值, 在可读性和安全性方面虽然不如前面讲的第一种使用自定义类型的方案, 然而却比第二种使用map的方案要好的多, 至少使用元组能知道函数会返回几个值, 这些值又分别是什么类型, 而且它还有第二种使用map的方案编码简单快捷的优势。

另人遗憾的是, 像java、c++、c#之类行业内主流的编程语言都不内置元组这一项特性,要使用元组必须自行实现,所幸现在这些编程语言都支持泛型, 实现非内置元组也变的异常简单, 但是毕竟是非语言内置的语法元素,使用起来肯定不如原生元组来的便捷。

下面介绍一个第三方的Java元组库类库,名称叫做Javatuples,有自己的官方主页, github star数也有几百,在Java元组库领域差不多起着垄断的地位了。

Javatuples定义的元组最大长度为10, 其实我觉得10元组的元素数量已经是太多了, 基本上没有什么可读性可言了。 元组类的定义如下

Unit (1element)

Pair (2elements)

Triplet (3elements)

Quartet (4elements)

Quintet (5elements)

Sextet (6elements)

Septet (7elements)

Octet (8elements)

Ennead (9elements)

Decade (10 elements)

这些原型类都是泛型类, 所以尖括号中的字母可以使用任意类型来代替。 下面是一个三元组的代码示例

举一反三,其余的元组类型也是同样的使用方式。

因为Java的元组并非语言自身支持, 因此代码看起来Java味十足, 显得不那么优雅。然而, 写代码时除了书写便捷能提高效率以外,更要注重的是代码本身所表达的意途, 在这里就是利用元组本身的含意(作用)来对代码进行增强, 至于是用什么方式书写其实只是次要的。

最后, 要注意的是泛型尖括号里面的类型不能是Java的基本类型, 如果要使用基本类型那也必须是经过装箱的基础类型,如int形必须转成Integer,bool型对应Boolean类型。

java元组_Java中元组的使用相关推荐

  1. java 配对问题_Java中的配对类是什么?

    java 配对问题 Java Pair class stores two values in the form of a tuple. This can be useful to get a func ...

  2. java 事务_Java中事务总结详解(精华)

    1.什么是JAVA事务? 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性 (is ...

  3. [转载] c++多态与java多态性_Java中的多态性

    参考链接: Java中的加法和串联 c++多态与java多态性 Polymorphism is one of the core concepts of OOPS paradigm. The meani ...

  4. java 且_JAVA中逻辑运算符“|”和“”与“||”和“”的用法

    1.使用规则: (1)& 可以用作逻辑与的运算符,表示逻辑与(and) a.当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false ...

  5. java 包装类_Java中的包装类

    Java中哪些需要包装类 它们将原始数据类型转换为对象.如果我们希望修改传递给方法的参数,则需要对象(因为基元类型是按值传递的). java.util包中的类只处理对象,因此在这种情况下包装类也有帮助 ...

  6. java 难度_java中难度大一点的面试题

    1.请大概描述一下Vector和ArrayList的区别,Hashtable和HashMap的区别.(5) (1)Vector和ArrayList的异同 实现原理,功能相同,可以互用 主要区别: Ve ...

  7. math java 计算_Java中的数学计算函数汇总

    Math类:  java.lang.Math类中包含基本的数字操作,如指数.对数.平方根和三角函数. java.math是一个包,提供用于执行任意精度整数(BigInteger)算法和任意精度小数(B ...

  8. java中的多态性_[转载] c++多态与java多态性_Java中的多态性

    参考链接: Java中的加法和串联 c++多态与java多态性 Polymorphism is one of the core concepts of OOPS paradigm. The meani ...

  9. c++多态与java多态性_Java中的多态性

    c++多态与java多态性 Polymorphism is one of the core concepts of OOPS paradigm. The meaning of polymorphism ...

  10. java引_JAVA中的引用

    JDK1.2之后,Java扩充了引用的概念,将引用分为强引用.软引用.弱引用和虚引用四种. 强引用 类似于"Object a = new Object()"这类的引用,只要垃圾强引 ...

最新文章

  1. HashMap的31连环炮,我倒在第5个上
  2. LoadRunner学习第四天——检查点学习(转载)
  3. 东北大学 计算机调剂,2018年东北大学信息科学与工程学院考研调剂信息
  4. Plupload+easyui+springmvc实现批量上传
  5. [渝粤教育] 中国矿业大学 恋爱心理学 参考 资料
  6. Stack/Queue与Vector/List的联系
  7. Error: file not found: arch/arm/boot/compressed/piggy.lzo
  8. 企业域名更换操作系列4:下载旧域域信息配置
  9. 分区操作后索引的状态
  10. 理解、创建、使用和测试HttpClient
  11. leetcode 318 最大单词长度乘积
  12. 论文笔记:语音情感识别(三)手工特征+CRNN
  13. idea导入tomcat源码
  14. 【Pix4d精品教程】Pix4d模型成果导出OSGB并加载OSGB到EPS进行三维测图完美案例教程
  15. Drools规则引擎实践直白总结,Java开发教程入门
  16. ADI 485芯片型号
  17. mysql命令行备份数据库
  18. 【Java 8 新特性】Java CompletableFuture thenApply()
  19. 【Unity】Obi插件系列(五)—— 约束
  20. 前端初级学习阶段(3)

热门文章

  1. POI java.lang.IllegalArgumentException: Merged region xxx must contain 2 or more cells问题解决
  2. ubuntu11.04(unix 就可以了) 共享文件以及支持上传文件
  3. 《凤凰架构》读后感 - 演进中的架构
  4. python学习-02(数据类型、字符串、列表、元祖、字典)
  5. Molecular Contrastive Learning of Representations via Graph Neural Networks
  6. cim系统 是什么_CIM和IBM i:它是什么以及它如何工作
  7. CSP开发基础--CSP入门简介
  8. GRE单词积累(1)
  9. python Pystaller 将python文件打包成exe
  10. 单片机移位操作;_crol_ 和_cror_ 的使用