从‘左中右’到‘键值对’:Apache Commons Lang3中Pair与Triple的深度解析
在Java开发中,我们经常遇到需要从方法返回多个值的场景。传统做法包括创建专用实体类、使用Map集合或数组,但这些方案要么过于繁琐,要么缺乏类型安全。Apache Commons Lang3库提供的Pair和Triple工具类,为这类问题提供了优雅的解决方案。本文将深入探讨这些工具类的不同实现变体、设计哲学和实际应用技巧。
1. Pair与Triple的设计哲学
1.1 两种范式:L/R与K/V
Apache Commons Lang3提供了两种不同的Pair设计范式:
- L/R范式:将两个元素视为平等的"左"和"右"关系,通过
getLeft()和getRight()方法访问 - K/V范式:将两个元素视为键值对关系,通过
getKey()和getValue()方法访问
java复制// L/R范式示例
ImmutablePair<String, Integer> lrPair = ImmutablePair.of("年龄", 25);
System.out.println(lrPair.getLeft()); // 输出:年龄
System.out.println(lrPair.getRight()); // 输出:25
// K/V范式示例
ImmutablePair<String, Integer> kvPair = ImmutablePair.of("age", 25);
System.out.println(kvPair.getKey()); // 输出:age
System.out.println(kvPair.getValue()); // 输出:25
虽然两种范式在功能上相似,但语义上有重要区别:
| 范式类型 | 适用场景 | 方法接口 | 语义强调 |
|---|---|---|---|
| L/R | 平等关系的两个值 | getLeft(), getRight() | 元素地位平等 |
| K/V | 键值映射关系 | getKey(), getValue() | 主从关系 |
1.2 不可变与可变实现
Lang3为Pair和Triple提供了不可变和可变两种实现:
-
不可变实现:
ImmutablePair,ImmutableTriple- 创建后内容不可修改
- 线程安全
- 适合作为方法返回值或缓存键
-
可变实现:
MutablePair,MutableTriple- 创建后可通过setter方法修改内容
- 非线程安全
- 适合需要频繁修改的场景
java复制// 不可变Pair示例
