一、元组介绍

仅仅一次方法调用就可以返回多个对象,你应该经常需要这样的功能吧.可以return语句只允许返回单个对(可能有人说返回一个集合就可以了,请记住,一个集合也只是一个对象而已)因此,解决办法就是创建一个对象,用它来持有想要返回的对象.当然,可以在每次需要的时候,专门创建一个类来完成这样的工作.可是有了泛型,我们就能够一次性的解决问题,以后再也不用再这种问题上浪费时间了.同时,我们再编译器就可以确保类型安全.

上述概念称为元组(tuple),它是将一组对象直接打包存储与其中的一个单一对象.这个容器对象允许读取其中的元素.但是不允许向其中存放新的对象.(这个概念也称为数据传送对象,或信使)

通常元素具有任意长度,同时,元组中的对象可以是任何不同的类型.不过,我们希望能够为每一个对象指明其类型,并且从容器中读取出来时,能够得到正确的类型.要处理不同长度的问题,我们需要创建不同的元组.采用下面的编码形式无疑是更安全的做法,这样的话,如果程序员想要使用具有不同元素的元组,就强制要求他们创建一个新的元组对象.并且可以利用继承机制实现长度更长的元组.

元组和列表list一样,都可能用于数据存储,包含多个数据;但是和列表不同的是:列表只能存储相同的数据类型,而元组不一样,它可以存储不同的数据类型,比如同时存储int、string、list等,并且可以根据需求无限扩展。比如说在web应用中,经常会遇到一个问题就是数据分页问题,查询分页需要包含几点信息:当前页数、页大小;查询结果返回数据为:当前页的数据记录,但是如果需要在前台显示当前页、页大小、总页数等信息的时候,就必须有另外一个信息就是:数据记录总数,然后根据上面的信息进行计算得到总页数等信息。这个时候查询某一页信息的时候需要返回两个数据类型,一个是list(当前也的数据记录),一个是int(记录总数)。当然,完全可以在两个方法、两次数据库连接中得到这两个值。事实上在查询list的时候,已经通过sql查询得到总计录数,如果再开一个方法,再做一次数据库连接来查询总计录数,不免有点多此一举、浪费时间、浪费代码、浪费生命。言重了~在这种情况下,我们就可以利用二元组,在一次数据库连接中,得到总计录数、当前页记录,并存储到其中,简单明了!(http://www.cnblogs.com/davidwang456/p/4514659.html)

二、使用介绍

二元组常见代码形式可以如下所示:

public class TwoTuple {

public final A first;

public final B second;

public TwoTuple(A a, B b){

first = a;

second = b;

}

public String toString(){

return "(" + first + ", " + second + ")";

}

}

利用继承机制实现长度更长的元组.将上述二元组扩展为三元组代码形式可以如下所示:

public class ThreeTuple extends TwoTuple{

public final C third;

public ThreeTuple(A a, B b, C c) {

super(a, b);

third = c;

}

public String toString(){

return "(" + first + "," + second + "," + third + ")";

}

}

利用继承机制实现长度更长的元组.将上述三元组扩展为四元组代码形式可以如下所示:

public class FourTuple extends ThreeTuple{

public final D fourth;

public FourTuple(A a, B b, C c, D d) {

super(a, b, c);

fourth = d;

}

public String toString(){

return "(" + first + "," + second + "," + third + "," + fourth + ")";

}

}

为了使用元组,你只需定义一个长度适合的元组,将其作为方法的返回值,然后在return语句中创建该元组,并返回即可.例如下面使用方式:

使用方式实例一:

/**

* 由于有了泛型,你可以很容易的创建元组,令其返回一组任意类型的对象,而你所要做的,只是编写表达式而已.

*/

public class TupleTest {

static TwoTuple f(){

//Autoboxing conveerts the int to Integer;

return new TwoTuple("hi", 47);

}

static ThreeTuple g(){

return new ThreeTuple(new Amphibian(), "hi", 47);

}

static FourTuple h(){

return new FourTuple(new Vehicle(), new Amphibian(), "hi", 47);

}

public static void main(String[] args) {

TwoTuple ttsi = f();

System.out.println(ttsi);

System.out.println(g());

System.out.println(h());

}

}

class Amphibian {}

class Vehicle {}

使用方式实例二:

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

import java.util.HashMap;

import java.util.Map;

public class DynamicProxyMixin {

public static void main(String[] args) {

Object mixin = MixinProxy.newInstance(new TwoTuple(new BasicImpl(), Basic.class), new TwoTuple(new TimeStampedImp(), TimeStamped.class), new TwoTuple(new SerialNumberedImpl(), SerialNumbered.class));

Basic b = (Basic) mixin;

TimeStamped t = (TimeStamped) mixin;

SerialNumbered s = (SerialNumbered) mixin;

b.set("hello");

System.out.println(b.get());

System.out.println(t.getStamp());

System.out.println(s.getSerialNumber());

}

}

class MixinProxy implements InvocationHandler{

Map delegatesByMethod;

public MixinProxy(TwoTuple>... pairs){

delegatesByMethod = new HashMap();

for(TwoTuple> pair : pairs){

for(Method method : pair.second.getMethods()){

String methodName = method.getName();

if(!delegatesByMethod.containsKey(methodName)){

delegatesByMethod.put(methodName, pair.first);

}

}

}

}

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

String methodName = method.getName();

Object delegate = delegatesByMethod.get(methodName);

return method.invoke(delegate, args);

}

public static Object newInstance(TwoTuple... pairs){

Class[] interfaces = new Class[pairs.length];

for(int i = 0; i < pairs.length; i++){

interfaces[i] = (Class) pairs[i].second;

}

ClassLoader cl = pairs[0].first.getClass().getClassLoader();

return Proxy.newProxyInstance(cl, interfaces, new MixinProxy(pairs));

}

}

interface TimeStamped{

long getStamp();

}

class TimeStampedImp implements TimeStamped{

private final long timeStamp;

public TimeStampedImp() {

timeStamp = new Date().getTime();

}

@Override

public long getStamp() {

return timeStamp;

}

}

interface SerialNumbered{

long getSerialNumber();

}

class SerialNumberedImpl implements SerialNumbered{

private static long counter = 1;

private final long serialNumber = counter++;

public long getSerialNumber(){

return serialNumber;

}

}

interface Basic{

public void set(String val);

public String get();

}

class BasicImpl implements Basic{

private String value;

public void set(String val){

value = val;

}

@Override

public String get() {

return value;

}

}

java元组_Java元组Tuple介绍与使用相关推荐

  1. java代码生成_Java代码生成器CodeX4J介绍

    用代码生成器生成一些固定的或有规律的代码,可以有效的提高工作效率.我写了个开源的,放在了GitHub上,希望能对有需要的朋友有所帮助. 先做一下简单介绍: CodeX4J是一款开源的Java代码生成器 ...

  2. python元组元素的提取比_Python 元组数据类型(tuple)详解 [访问元组元素][修改元组元素][删除元组][学习 Python 必备基础知识][看此一篇就够了]...

    您的"关注"和"点赞",是信任,是认可,是支持,是动力...... 如意见相佐,可留言. 本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新. 1 元 ...

  3. python中元组拆包_Python 元组拆包示例(Tuple Unpacking)

    1.元组? 元组的特点: 相当于不可变得列表: 可用于没有字段名的记录. pythn里的元组就相当于C语言里的数组,是不可变的,但是也可以容纳不同类型的元素,也是容器的一种. >>> ...

  4. php 元组,python元组与字典的详细介绍

    一.元组 1.元组的表达(1,2,3,4) ('olive',123) ("python",) 创建元组:a=tuple((1,2,3,)) b=("python&quo ...

  5. java的基础类库称为_JAVA基本类库介绍

    8.1 包的概念 包是由.class文件组成的一个集合,.class文件时可以用Java解释其解释执行的文件,它也是由Java源的文件,即.Java文件经编译而生成的.Java是一种面向对象的语言,它 ...

  6. python包含多个元组的元组_Python数据结构(元组,列表,字典)

    Python内置了 几种数据结构,元组,列表 字典 1.元组 元组可以由不同的元素组成,所有元素通过圆括号(  )包含起来,并通过逗号","隔开.如变量名 = (元素1,元素2,. ...

  7. python创建一个空元组_如何在Python中从空元组创建元组?

    元组()是唯一真正的空元组, 但是()和((), )创建长度为1的元组, 其中包含长度为0的元组, 但长度为零的元组本身不包含在内. 如果您想获得以下问题的答案: 如何创建一个 空的 (或空值)元组. ...

  8. #python元组(元组的创建和删除)

    元组的创建和删除 元组(tuple)是python中另一个重要的序列结构,与列表类似,也是有一系列按特定排列的元素组成.但是他是不可变序列,因此元组也可以称之为不可变的列表.在形式上元组的所有元素都放 ...

  9. python中的元组、元组和列表的区别

    元组用tuple来表示 1.元组的表达式 tuple = () tuple1 = ('china','dcs8',888,'中国',['duoceshi',666]) print(tuple1) pr ...

最新文章

  1. couchdb 自动生成html,如何在CouchDB中使用html模板
  2. mysql kill 脚本_批量 kill mysql 中运行时间长的sql
  3. 书生阅读器打开gd文件出错_CAJ论文怎么打开?
  4. SkyWalking集成与案例
  5. 初学者宝典:C语言入门基础知识大全(下)
  6. MySQL基本配置命令总结
  7. ibatis java_iBatis.java
  8. qq浏览器网页翻译_如何通过Edge浏览器调用“谷歌翻译”,将整个网页翻译为中文...
  9. 时间操作(JavaScript版)—页面显示格式:年月日 时分秒 星期
  10. tsp问题动态规划python_TSP问题——动态规划
  11. Windows10如何卸载微软商店
  12. python爬取公众号之 创建个人微信公众号
  13. AS | 中大丁涛/田国宝等揭示口腔菌群的差异化输入塑造了与健康状况相关的两种肺型...
  14. 呼叫中心座席人员如何把控时间
  15. id门禁卡复制到手机_门禁卡复制到苹果手机
  16. [转]Google Linux Cluster的系统结构分析(余一娇)
  17. 世界末日来了别怕!五种新技术抱紧你
  18. 计算机考神经科学,科学网—神经科学杂谈6:电脑和人脑的最大不同--计算和记忆 - 吴景鹏的博文...
  19. matlab在解析几何教学中的应用,Matlab在解析几何教学中的应用
  20. 勒索病毒locked勒索病毒后缀成功解密文档恢复数据库,专业事情交给专业的人

热门文章

  1. 【BZOJ 1951】 [Sdoi2010]古代猪文
  2. 内联元素转化为内联块元素的一些小细节
  3. 自从用了Less 编写css,你比以前更快了~
  4. 初学者虚拟机使用虚拟机
  5. 安装Bas的先决条件
  6. 华为机试HJ93:数组分组
  7. 解决方案-CMake error: error in configuration process, project files may be invalid(WindowsVS可参考)
  8. 计算机技术薄弱对我省影响,计算机技术在贵州省西南地区的运用前景.docx
  9. html中位div添加水平线,html中div使用CSS实现水平/垂直居中的多种方式
  10. 合沟微服务怎么添加_微服务架构:动态配置中心搭建