java tuple_Java元组Tuple使用实例

本文介绍了在编程中如何使用元组优化数据返回,特别是在分页查询场景下。通过元组,可以一次性返回列表数据和记录总数,减少数据库交互,提高效率。同时对比了Apache Commons Lang3的Pair和Triple类在处理多个值时的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.为什么使用元组tuple?

元组和列表list一样,都可能用于数据存储,包含多个数据;但是和列表不同的是:列表只能存储相同的数据类型,而元组不一样,它可以存储不同的数据类型,比如同时存储int、string、list等,并且可以根据需求无限扩展。

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

二.源码实例

1.二元组

packagecom.bijian.test;/*** 两个元素的元组,用于在一个方法里返回两种类型的值*/

public class TwoTuple{public finalA first;public finalB second;publicTwoTuple(A a, B b) {this.first =a;this.second =b;

}

}

2.扩展为三元组(按此可以任意扩展)

packagecom.bijian.test;/*** 三个元素的元组,用于在一个方法里返回三种类型的值*/

public class ThreeTuple extends TwoTuple{public finalC third;publicThreeTuple(A a, B b, C c) {super(a, b);this.third =c;

}

}

3.实体DTO

packagecom.bijian.test;public classGoodsBean {private intgoodsId;public intgetGoodsId() {returngoodsId;

}public void setGoodsId(intgoodsId) {this.goodsId =goodsId;

}

}

4.元组操作工具类、测试类(可按需自定义)

packagecom.bijian.test;importjava.util.ArrayList;importjava.util.List;/*** 元组辅助类,用于多种类型值的返回,如在分页的时候,后台存储过程既返回了查询得到的

* 当页的数据(List类型),又得到了数据表中总共的数据总数(Integer类型),然后将这

* 两个参数封装到该类中返回到action中使用

* 使用泛型方法实现,利用参数类型推断,编译器可以找出具体的类型*/

public classTupleUtil {public static TwoTupletuple(A a, B b) {return new TwoTuple(a, b);

}public static ThreeTupletuple(A a, B b, C c) {return new ThreeTuple(a, b, c);

}//测试

public static voidmain(String[] args) {

List goodsBeans = new ArrayList();for(int i = 1; i < 26; i++) {

GoodsBean goodsBean= newGoodsBean();

goodsBean.setGoodsId(i);

goodsBeans.add(goodsBean);

}

Integer totalProperty= 47;//TupleUtil, Integer> tupleUtil = new TupleUtil, Integer>(goodsBeans, totalProperty);

TwoTuple, Integer> twoTuple =TupleUtil.tuple(goodsBeans, totalProperty);

List list =twoTuple.first;

System.out.println(list);

System.out.println(twoTuple.second);

}

}

运行结果:

afb335513f4742e28adb2c44c18e637f.png

三.org.apache.commons.lang3.tuple

用于处理一对键值的对象pair类似于Map.entry,commons lang3增加了可以处理3个值的Triple基类,此包下定义了Pair抽象基类,及MutablePair,MutableTriple,ImmutablePair,ImmutableTriple子类。

一个线程非安全,另一个线程安全

接口:

1.Pair:封装一对键值对。

实现类:可变:MutablePair,不可变:ImmutablePair

2.Triple:封装3个值的类

实现类:ImmutableTriple; MuttableTriple

如上实例修改如下:

packagecom.bijian.test;importjava.util.ArrayList;importjava.util.List;importorg.apache.commons.lang3.tuple.Pair;public classTupleUtil2 {//测试

public static voidmain(String[] args) {

List goodsBeans = new ArrayList();for(int i = 1; i < 26; i++) {

GoodsBean goodsBean= newGoodsBean();

goodsBean.setGoodsId(i);

goodsBeans.add(goodsBean);

}

Integer totalProperty= 47;

Pair, Integer> twoTuple =Pair.of(goodsBeans, totalProperty);

List list =twoTuple.getLeft();

System.out.println(list);

System.out.println(twoTuple.getRight());

}

}

运行结果:

04e663d563979ce24d4a93a5f251c09d.png

PS:org.apache.commons.lang3.tuple.Pair的compareTo方法

org.apache.commons.lang3.tuple.Pair的compareTo方法的入参不能为空,实例如下。

packagecom.bijian.test;importorg.apache.commons.lang3.tuple.Pair;public classPairTest {private Pair pair = Pair.of(100l, 60l);public static voidmain(String[] args) {

PairTest pairTest= newPairTest();

pairTest.test1();

pairTest.test2();

}public voidtest1() {

System.out.println("pair" + pair); //pair(100,60)

Pair newPair = Pair.of(3000l, 30l);

System.out.println("newPair" + newPair); //newPair(3000,30)

System.out.println(newPair != pair); //true

System.out.println(pair.compareTo(newPair)); //-1

}public voidtest2() {

System.out.println("pair" + pair); //pair(100,60)

Pair newPair = null;

System.out.println("newPair" + newPair); //newPairnull

System.out.println(newPair != pair); //true

System.out.println(pair.compareTo(newPair)); //Exception in thread "main" java.lang.NullPointerException

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值