当前位置: 首页 > news >正文

Hutool 库中使用 Pair类返回键值对

目录

  • 一、Pair 是什么?
  • 二、最简单的例子
  • 三、它有什么作用?
  • 四、为什么叫 Pair(一对)
  • 五、和 Map 有什么区别?
    • Pair
    • Map
  • 六、实际开发中的使用场景
    • 场景1:返回两个值
    • 场景2:遍历时临时保存两个对象
    • 场景3:方法之间传递两个关联数据
    • 场景4:排序
  • 七、Pair 不是 Map.Entry
  • 八、Hutool Pair 提供的方法
  • 九、与 MutablePair 的区别
  • 十、在实际项目中是否推荐使用?

一、Pair 是什么?

Pair<K, V>是 Hutool库 提供的一个通用键值对(Key-Value)对象,它的作用就是把两个相关的数据临时封装到一个对象中,避免为了返回两个值而专门创建一个 Java Bean。

它位于:

cn.hutool.core.lang.Pair

它内部实际上非常简单,只包含两个字段:keyvalue。创建后就是一个不可变(Immutable)的键值对(不能修改 key/value,只能读取)。(Hutool Plus)


二、最简单的例子

例如:

Pair<String,Integer>pair=Pair.of("Tom",18);System.out.println(pair.getKey());System.out.println(pair.getValue());

输出

Tom 18

也可以直接 new:

Pair<String,Integer>pair=newPair<>("Tom",18);

不过官方更推荐:

Pair.of(key,value)

因为类型推导更方便。(Hutool Plus)


三、它有什么作用?

很多时候,一个方法想返回两个值。

例如:

假设我们有一个方法,需要返回:

  • 用户ID
  • 用户姓名

如果没有 Pair,你只能:

方案一:创建对象

classUserInfo{privateLongid;privateStringname;}

然后:

returnnewUserInfo(id,name);

如果这个对象以后再也不用,就会觉得比较麻烦。


于是 Pair 就可以这样:

publicPair<Long,String>getUser(){returnPair.of(1001L,"张三");}

调用:

Pair<Long,String>user=getUser();Longid=user.getKey();Stringname=user.getValue();

四、为什么叫 Pair(一对)

因为它就是:

(key,value)

例如:

("Tom",18) ("Apple",8.5) ("北京",2150) ("手机号","181****8888")

就是一对数据。


五、和 Map 有什么区别?

很多初学者都会疑惑:

Map 也是 Key -> Value,为什么还要 Pair?

区别非常大。

Pair

只表示:

一个 Key 一个 Value

例如:

("Tom",18)

只有这一组。


Map

Map 保存的是:

很多 Pair

例如:

Tom -> 18 Jack -> 20 Lucy -> 22

实际上可以理解成:

Map │ ├── Pair("Tom",18) ├── Pair("Jack",20) ├── Pair("Lucy",22)

所以:

Pair 表示一条数据,而 Map 表示很多条 Pair。


六、实际开发中的使用场景

场景1:返回两个值

例如:

查询数据库:

需要返回:

  • 成功数量
  • 失败数量
publicPair<Integer,Integer>count(){returnPair.of(120,5);}

调用:

Pair<Integer,Integer>result=count();System.out.println(result.getKey());//120System.out.println(result.getValue());//5

场景2:遍历时临时保存两个对象

例如:

订单

订单号 订单金额

可以写:

Pair<String,BigDecimal>order=Pair.of("NO10001",newBigDecimal("99.8"));

场景3:方法之间传递两个关联数据

例如:

登录成功后:

需要返回:

token user

可以:

Pair<String,User>login(){returnPair.of(token,user);}

场景4:排序

例如:

统计词频:

apple -> 10 banana -> 6 cat -> 9

可以转成:

List<Pair<String,Integer>>

然后根据 value 排序。


七、Pair 不是 Map.Entry

很多人第一次看会误认为:

Pair == Map.Entry

其实不是。

例如:

Map<String,Integer>map=newHashMap<>();

遍历:

for(Map.Entry<String,Integer>entry:map.entrySet()){}

这里得到的是:

Map.Entry

不是:

Pair

虽然:

Map.Entry Pair

都表示:

key value

但是它们属于两个不同的类。


八、Hutool Pair 提供的方法

常用方法非常少:

Pair.of(key,value)

创建对象。


getKey()

获取 Key。


getValue()

获取 Value。


equals()

判断两个 Pair 是否相同。

例如:

Pair.of("A",1)

Pair.of("A",1)

相等。


hashCode()

用于 HashMap、HashSet 等集合。


toString()

打印字符串。


九、与 MutablePair 的区别

Hutool 还有一个:

MutablePair

顾名思义:

Mutable = 可修改

例如:

MutablePair<String,Integer>pair=newMutablePair<>("Tom",18);pair.setKey("Jack");pair.setValue(20);

而普通Pair创建以后:

Pair<String,Integer>pair=Pair.of("Tom",18);

只能:

pair.getKey();pair.getValue();

不能修改内部的值,因此更安全。(Hutool Plus)


十、在实际项目中是否推荐使用?

推荐使用Pair的场景:

  • ✔ 方法临时返回两个值
  • ✔ Stream 流处理中临时组合两个对象
  • ✔ 排序、中间计算过程中的数据封装
  • ✔ 工具类内部使用

不推荐使用的场景:

  • ❌ Controller 返回值(接口响应应该使用明确的 DTO)
  • ❌ Service 对外接口长期暴露(返回UserInfoDTO等语义明确的对象更好)
  • ❌ 数据库实体(Entity)
  • ❌ 业务对象(VO、DTO、BO)

例如:

// ✔ 合适Pair<BigDecimal,BigDecimal>calculateTax();// ❌ 不推荐Pair<String,Object>queryUser();

第二种代码可读性很差,别人很难知道:

key

到底代表什么?

是:

  • 用户ID?
  • 用户名?
  • 手机号?

还是:

  • Token?

如果改成:

UserInfoDTO

就一目了然。


总结一句话:

Pair<K, V>本质上就是一个轻量级的二元组(Tuple),用于临时封装两个有关联的对象。它非常适合工具类、算法和中间计算过程,但不适合作为复杂业务对象的长期替代品。

http://www.jsqmd.com/news/1291576/

相关文章:

  • 2026年7月海南建材灰沙砖/海口加气砖和灰沙砖厂家推荐排行_海南重力建材有限公司 - 品牌宣传支持者
  • 大模型上下文长度:原理、挑战与RAG等主流扩展方案详解
  • png转jpg最简单方法:素材库格式混乱时的一条时间线 - 办公小帮手
  • 【单片机毕业设计推荐】基于 STM32 的超声波测距与智能声光报警监测系统设计,基于 STM32 的带温度补偿超声波测距 WiFi 监测 APP 系统设计(014204)
  • Cursor上安装agent skills --- MAC版本
  • 2026年7月佛山医疗自助终端机/佛山自助终端机机柜行业实力厂家_佛山市锐铠智能科技有限公司 - 行业平台推荐
  • 2026年7月_9.6米冷链车/昆明厢式冷链车厂家怎么选_云南鲜丰达冷链设备有限公司 - 品牌宣传支持者
  • 塔能两相液冷:单CDU支持30+机柜稳定并联,打破两相液冷规模化部署瓶颈**
  • Unity WebGL全屏自适应解决方案:从画布到UI的完整实践
  • 放大器非线性失真研究装置:从原理到实践的硬件设计与算法实现
  • 2026年7月沧州异型法兰定制/碳钢异型法兰厂家口碑榜_沧州誉守管件制造有限公司 - 品牌宣传支持者
  • jpg格式转换:设计稿要透明png时的实测记录 - AI测评专家
  • 新盛公司科技工程开户项目指南
  • 位图结构在集合操作中的性能优势与局限7
  • 2026年7月美国签证/探亲签证公司哪家服务好_济南凯盛商汇商务咨询有限公司 - 行业平台推荐
  • 上海崇明区防水补漏_2026上海生态岛漏水维修避坑指南与五大正规团队推荐 - 雨婺虹房屋维修
  • 嵌入式代码极致优化三板斧:查表法替代计算、循环展开与数据预取的正确姿势
  • 如何在浏览器中免费解锁QQ音乐、网易云加密文件:完整音乐解密指南
  • 【单片机毕业设计推荐】基于 STM32 的红外测温语音报警系统设计与实现 ,基于 STM32 的 GY906 非接触测温阈值预警装置设计(014704)
  • 南安市防水补漏_2026福建闽南侨乡漏水维修攻略与五大正规团队推荐 - 雨婺虹房屋维修
  • Python JSON数据提取实战:从基础解析到高级查询与性能优化
  • 宁波经济纠纷难题咋破?袁勤玮团队有高招,合同纠纷/金融纠纷/经济纠纷/法律顾问/公司纠纷,经济纠纷个人律师哪家专业 - 品牌推荐师
  • Bianfchheng (Sir)《边城(四)》字母标调拼音拼写实测案例
  • 如何永久备份QQ空间记忆:GetQzonehistory一键保存青春时光
  • 小语种人工翻译平台哪家强
  • 展锐T760平台Camera驱动调试实战:从硬件链路到Android HAL的完整指南
  • 基于51单片机的双通道波形发生器设计:从DAC原理到Proteus仿真
  • 2026年7月陕西餐饮智能化改造/炒菜机优质厂家推荐_珠海优特智厨(陕西分部) - 行业平台推荐
  • USB接口速度识别指南:从颜色标识到系统查询,快速找到电脑最快接口
  • STM32H750以太网通信实战:从硬件设计到LwIP集成的避坑指南