JTuple 1.1.0 正式版发布了,本次更新内容:
1. 调整Tuple1-Tuple4获取元素的方式,更人性化
2. 新增支持将元组转换成Stream
3. 新增Tuple5
4. 完善代码注释以及使用文档
JTuple
Java 语言版本的元组
数据类型,实现了元组类型的特性(不可变
、 可迭代
)以及常用操作方法
轻量级,无依赖,线程安全
元组的意义
元组最重要的意义是用来实现多值返现。 很多时候我们需要返回一组值,更可怕的是这组值的类型可能并不完全一样,比如http请求时,有请求的返回码(int)以及响应报文(String)
对于java人员来说,遇到这种情况时,一般的解决方案是编写一个类,类里只有2个属性,分别是以上2个,然后返回给调用者。是不是有种胸闷的感觉。折腾,造孽啊
或者就返回一个列表,但是因为类型不统一,只能用List<Object>
,后续处理的代码的可读性会很差,我相信任何一个技术水平过关或者有职业操守的程序员都不会这么做
元组的出现,就是为了解决这种情况的,很多年轻的语言(Python
, Scala
...)都内置了元组,本项目就是让Java开发人员也可以享受到元组带来的编程时的便捷和快乐
主要实现
类名 | 描述 |
---|---|
Tuple | 元组抽象,实现元组数据结构以及常用操作方法 |
Tuple0 | 空元组,不包含任何元素 |
Tuple1 | 只包含1个元素的元组 |
Tuple2 | 只包含2个元素的元组 |
Tuple3 | 只包含3个元素的元组 |
Tuple4 | 只包含4个元素的元组 |
Tuple5 | 只包含5个元素的元组 |
TupleN | 包含N个元素的元组 |
元组操作
操作API | 说明 |
---|---|
add | 元组合并 |
foreach | 元组迭代 |
forEachWithIndex | 元组带序号迭代 |
swap | 元组翻转 |
toArray | 元组转成数组 |
toList | 元组转成列表 |
get | 获取元组某一个元素 |
contains | 元组中是否包含某个元素 |
subTuple | 截取子元组 |
equals | 比较2个元组内容是否相同 |
toString | 输出字符串表示的元组,如: (123, 456) |
repeat | 重复元组内的所有元素 |
stream | 将元组转换成流,类似List.stream |
parallelStream | 将元组转换成并行流,类似List.parallelStream |
引用来自“游客”的评论
还不如定义一个对象方便呢引用来自“愚_者”的评论
java大量的pojo类,大量的getter setter,太繁琐了,如果pojo里的属性多于5个,写成pojo,也许心里还好过些。但是比如只为了2个属性,写一整套模板代码,太冗长,啰嗦了,而且项目里如果这种情况很多,那项目代码里会出现大量的“小”pojo类,实在是不好看。这也是很多新兴语言吐槽java的一个点引用来自“赵仁杰”的评论
groovy也有Tuple,可以试试java一直没有直接在语言级别提供,所以第三方实现的时候,受限于语法规则,使用体验上总是达不到最好,不过我这个项目已经在尽可能的提高使用体验了😄
引用来自“bogang2012”的评论
需要对取出的对象进行强制类型转换,否则会报错,比如下面的HashMapTuple2<Integer, HashMap<String, String>> t2 = Tuple2.with(2, new HashMap<String, String>(){{put("aaa", "bbb");}}) ;
HashMap map = (HashMap)t2.get(1);
另:你也可以这样取哦,HashMap map = t2.second;
😄
Tuple2<Integer, HashMap<String, String>> t2 = Tuple2.with(2, new HashMap<String, String>(){{put("aaa", "bbb");}}) ;
HashMap map = (HashMap)t2.get(1);
引用来自“swiftplus”的评论
@红薯 这个东西怎么上的头条,走的后门?你看不起我的东西没关系,你可以选择无视,有必要这样吗?
you can you up, no can no bb!
引用来自“F_L_F”的评论
Tuple1=first blood,Tuple2=double kill,Tuple3=triple kill,Tuple4=quatary kill,Tuple5=penta kill,TupleN=legendary引用来自“想入肥菲”的评论
用JTuple 返回的对象,如何排序,请作者后续版本添加啊!引用来自“愚_者”的评论
你指的是Tuple[]中,对里面的元组进行排序吗?引用来自“想入肥菲”的评论
是的,比如返回List<Tuple<int, str>>,想按照里面的int进行排序。引用来自“愚_者”的评论
嗯嗯,好的,我知道了,后续会提供这个功能😃引用来自“想入肥菲”的评论
回复@愚_者 : 多谢!引用来自“愚_者”的评论
突然发现jdk8的排序强到不行,因为是函数式API,所以扩展性已经极好了,元组的排序很容易实现,我都不知道我还能怎么优化,能比这更好了List<Tuple2<Integer, String>> list = new ArrayList<>();
list.add(Tuple2.with(5, "5"));
list.add(Tuple2.with(9, "9"));
list.add(Tuple2.with(2, "2"));
list.add(Tuple2.with(7, "7"));
list.add(Tuple2.with(1, "1"));
log.debug("before:{}", list);
list.sort(Comparator.comparingInt(t -> t.first));
log.debug("after:{}", list);
引用来自“想入肥菲”的评论
用JTuple 返回的对象,如何排序,请作者后续版本添加啊!引用来自“愚_者”的评论
你指的是Tuple[]中,对里面的元组进行排序吗?引用来自“想入肥菲”的评论
是的,比如返回List<Tuple<int, str>>,想按照里面的int进行排序。引用来自“愚_者”的评论
嗯嗯,好的,我知道了,后续会提供这个功能😃引用来自“想入肥菲”的评论
回复@愚_者 : 多谢!List<Tuple2<Integer, String>> list = new ArrayList<>();
list.add(Tuple2.with(5, "5"));
list.add(Tuple2.with(9, "9"));
list.add(Tuple2.with(2, "2"));
list.add(Tuple2.with(7, "7"));
list.add(Tuple2.with(1, "1"));
log.debug("before:{}", list);
list.sort(Comparator.comparingInt(t -> t.first));
log.debug("after:{}", list);
引用来自“想入肥菲”的评论
用JTuple 返回的对象,如何排序,请作者后续版本添加啊!引用来自“愚_者”的评论
你指的是Tuple[]中,对里面的元组进行排序吗?引用来自“想入肥菲”的评论
是的,比如返回List<Tuple<int, str>>,想按照里面的int进行排序。引用来自“愚_者”的评论
嗯嗯,好的,我知道了,后续会提供这个功能😃引用来自“洛阳码农”的评论
模仿c#吗?引用来自“愚_者”的评论
谈不上模仿,很多语言都有元组,不止是C#,而java没有,我只是用Java语言实现了,元组的概念在各个语言里都是基本一样的。在现代的开发中,这本应该是开发语言直接提供的引用来自“Mr.CT”的评论
pojo get/set ide生成的哦。引用来自“想入肥菲”的评论
用JTuple 返回的对象,如何排序,请作者后续版本添加啊!引用来自“愚_者”的评论
你指的是Tuple[]中,对里面的元组进行排序吗?引用来自“想入肥菲”的评论
是的,比如返回List<Tuple<int, str>>,想按照里面的int进行排序。引用来自“洛阳码农”的评论
模仿c#吗?引用来自“愚_者”的评论
谈不上模仿,很多语言都有元组,不止是C#,而java没有,我只是用Java语言实现了,元组的概念在各个语言里都是基本一样的。在现代的开发中,这本应该是开发语言直接提供的引用来自“想入肥菲”的评论
用JTuple 返回的对象,如何排序,请作者后续版本添加啊!引用来自“愚_者”的评论
你指的是Tuple[]中,对里面的元组进行排序吗?引用来自“想入肥菲”的评论
用JTuple 返回的对象,如何排序,请作者后续版本添加啊!引用来自“unrealt84”的评论
Tuple的理念我是赞成的,但说实话你这里的实现感觉不是很好,特别是名字Tuple0到Tuple5,我还是喜欢Unit、Pair、Triplet这样的名字。我之前在用 org.javatuples:javatuples:1.2,虽然是好几年前的东西了,感觉还是挺好用的。引用来自“panmingguang”的评论
我一直是用 map<String, Object> 没觉得不方便 , 这种放回 要的类型统一, Object 对应基本类型 数据库常用类型, get set 对于 返回 json 操作交互来讲 早就没必要了但是如果不是走json呢?或者只是你业务代码里的中间结果呢?用Object的话可读性是很差的,这种场景我觉得用元组是比较合适的,少了很多强转代码,也不用再定义一个pojo,可读性也很高😄
但是乳沟java基础类库就有这个多好啊,使用这个,还是对已有代码侵入性有点大。
引用来自“洛阳码农”的评论
模仿c#吗?引用来自“愚_者”的评论
谈不上模仿,很多语言都有元组,不止是C#,而java没有,我只是用Java语言实现了,元组的概念在各个语言里都是基本一样的。在现代的开发中,这本应该是开发语言直接提供的引用来自“robortly”的评论
本来就是模仿C#的特性 ;楼上这么说 “元组的概念在各个语言里都是基本一样的”,支持只是一个时间问题,这他妈不是一个笑话吗?引用来自“游客”的评论
还不如定义一个对象方便呢引用来自“愚_者”的评论
java大量的pojo类,大量的getter setter,太繁琐了,如果pojo里的属性多于5个,写成pojo,也许心里还好过些。但是比如只为了2个属性,写一整套模板代码,太冗长,啰嗦了,而且项目里如果这种情况很多,那项目代码里会出现大量的“小”pojo类,实在是不好看。这也是很多新兴语言吐槽java的一个点引用来自“Pasenger”的评论
使用lombok完美解决这个问题引用来自“游客”的评论
还不如定义一个对象方便呢引用来自“愚_者”的评论
java大量的pojo类,大量的getter setter,太繁琐了,如果pojo里的属性多于5个,写成pojo,也许心里还好过些。但是比如只为了2个属性,写一整套模板代码,太冗长,啰嗦了,而且项目里如果这种情况很多,那项目代码里会出现大量的“小”pojo类,实在是不好看。这也是很多新兴语言吐槽java的一个点引用来自“十一十二”的评论
关键看怎么用osc: http://git.oschina.net/pyinjava/jtuple
readme里有详细的使用方法😄
引用来自“shitalpig”的评论
在哪里 github的地址?osc: http://git.oschina.net/pyinjava/jtuple
引用来自“哈哈爱兮爱兮乎乎”的评论
读方便,写啰嗦。有没有自动的key?引用来自“洛阳码农”的评论
模仿c#吗?引用来自“shitalpig”的评论
文档呢,Java垃圾,看看c# 的元祖 多么完美啊引用来自“游客”的评论
还不如定义一个对象方便呢引用来自“愚_者”的评论
java大量的pojo类,大量的getter setter,太繁琐了,如果pojo里的属性多于5个,写成pojo,也许心里还好过些。但是比如只为了2个属性,写一整套模板代码,太冗长,啰嗦了,而且项目里如果这种情况很多,那项目代码里会出现大量的“小”pojo类,实在是不好看。这也是很多新兴语言吐槽java的一个点引用来自“ODMark”的评论
我写过很多对象,可依然孑然一身。引用来自“notreami”的评论
难道你们都不知道 lombok?getter、setter已经是过去式了引用来自“游客”的评论
这个和spring-tuple相比,有啥优势呢?引用来自“游客”的评论
这个和spring-tuple相比,有啥优势呢?引用来自“游客”的评论
还不如定义一个对象方便呢引用来自“愚_者”的评论
java大量的pojo类,大量的getter setter,太繁琐了,如果pojo里的属性多于5个,写成pojo,也许心里还好过些。但是比如只为了2个属性,写一整套模板代码,太冗长,啰嗦了,而且项目里如果这种情况很多,那项目代码里会出现大量的“小”pojo类,实在是不好看。这也是很多新兴语言吐槽java的一个点引用来自“ODMark”的评论
我写过很多对象,可依然孑然一身。引用来自“游客”的评论
还不如定义一个对象方便呢引用来自“愚_者”的评论
java大量的pojo类,大量的getter setter,太繁琐了,如果pojo里的属性多于5个,写成pojo,也许心里还好过些。但是比如只为了2个属性,写一整套模板代码,太冗长,啰嗦了,而且项目里如果这种情况很多,那项目代码里会出现大量的“小”pojo类,实在是不好看。这也是很多新兴语言吐槽java的一个点引用来自“kidbei”的评论
这跟写个类继承ArrayList有什么区别:bowtie:这是一个工具包,目的是提高开发者的开发效率,节省开发时间,如果你要问和其他实现有什么区别,那几乎一切工具类型的包,你都可以问出这个问题:bowtie:
引用来自“游客”的评论
还不如定义一个对象方便呢