Java开发利器Commons Lang之元组Tuple
标准Java库没有提供足够的方法来操作其核心类,Apache Commons Lang提供了这些额外的方法。
Apache Commons Lang为java提供了大量的帮助工具。lang API,特别是String操作方法、基本数值方法、对象反射、并发、创建和序列化以及System属性。此外,它还包含对java.util.Date的基本增强,以及一系列专门用于帮助构建方法的实用工具,如hashCode、toString和equals。
-- 来自官方简介http://commons.apache.org/proper/commons-lang/index.html
什么是元组?
元组(tuple)是关系数据库中的基本概念,关系是一张表,表中的每行(即数据库中的每条记录)就是一个元组,每列就是一个属性。 在二维表里,元组也称为行。 -- 摘自百度百科
如果从日常开发中我们可能经常遇到如下情形:我们写了某个方法,这个发放希望返回最大值和最小值两个值,这个时候怎么做呢?封装一个返回对象?或者返回一个json对象或者list,然后解析?这样确实有点难看!
那么好在Commons Lang给我们提供了一个tuple元组相关数据结构的实现,就可以帮助我们解决这种问题。
为什么使用元组tuple?
元组和列表list一样,都可能用于数据存储,包含多个数据;但是和列表不同的是:列表只能存储相同的数据类型,而元组不一样,它可以存储不同的数据类型,比如同时存储int、string、list等,并且可以根据需求无限扩展。
比如说在web应用中,经常会遇到一个问题就是数据分页问题,查询分页需要包含几点信息:当前页数、页大小;查询结果返回数据为:当前页的数据记录,但是如果需要在前台显示当前页、页大小、总页数等信息的时候,就必须有另外一个信息就是:数据记录总数,然后根据上面的信息进行计算得到总页数等信息。这个时候查询某一页信息的时候需要返回两个数据类型,一个是list(当前也的数据记录),一个是int(记录总数)。当然,完全可以在两个方法、两次数据库连接中得到这两个值。事实上在查询list的时候,已经通过sql查询得到总计录数,如果再开一个方法,再做一次数据库连接来查询总计录数,不免有点多此一举、浪费时间、浪费代码、浪费生命。言重了~在这种情况下,我们就可以利用二元组,在一次数据库连接中,得到总计录数、当前页记录,并存储到其中,简单明了!
Commons Lang Tuple
tuple相关的类位于org.apache.commons.lang3.tuple下,整个元组从是否可变的维度上分为可变元组和不可变元组;从元组元素数量的维度上分为二元组和三元组;然后两两组和,那么总共就有2x2种元组:可变二元组、不可变二元组、可变三元组、不可变三元组。
先来看下元组整个类图:
从类图上我们大致可以看到整个类之间的关系,所有二元组的基类是Pair,而Pair是继承自了Map.Entry;而三元组的基类是Triple。接下来进入实战环节。
可变二元组 MutablePair
@Test
public void testMutablePair() {
MutablePair<String, Boolean> mutablePair = MutablePair.of("test1", true);
System.out.println("左值:" + mutablePair.getLeft() + " 右值:" + mutablePair.getRight());
mutablePair.setLeft("test2");
mutablePair.setRight(false);
System.out.println("左值:" + mutablePair.getLeft() + " 右值:" + mutablePair.getRight());
输出:
左值:test1 右值:true
左值:test2 右值:false
}
不可变二元组 ImmutablePair
在不可变元组中,存储值的属性均被final修饰,因而不可变。
@Test
public void testImmutablePair() {
ImmutablePair<String, Boolean> immutablePair = ImmutablePair.of("test1", true);
System.out.println("左值:" + immutablePair.getLeft() + " 右值:" + immutablePair.getRight());
}
输出:
左值:test1 右值:true
可变三元组
@Test
public void testMutableTriple() {
MutableTriple<String, Boolean, Integer> mutableTriple = MutableTriple.of("test1", true, 1);
System.out.println(
"左值:" + mutableTriple.getLeft() + " 中间值:" + mutableTriple.getMiddle() + " 右值:" + mutableTriple.getRight());
mutableTriple.setLeft("test2");
mutableTriple.setMiddle(false);
mutableTriple.setRight(2);
System.out.println(
"左值:" + mutableTriple.getLeft() + " 中间值:" + mutableTriple.getMiddle() + " 右值:" + mutableTriple.getRight());
}
输出:
左值:test1 中间值:true 右值:1
左值:test2 中间值:false 右值:2
不可变三元组
不可变的原理同二元组,通过final修饰属性。
@Test
public void testImmutableTriple() {
ImmutableTriple<String, Boolean, Integer> immutableTriple = ImmutableTriple.of("test1", true, 1);
System.out.println(
"左值:" + immutableTriple.getLeft() + " 中间值:" + immutableTriple.getMiddle() + " 右值:" + immutableTriple.getRight());
}
输出:
左值:test1 中间值:true 右值:1
https://www.jianshu.com/p/dcedc7765eb8