1. 概述
本文探讨编程中一个超实用的概念——Pair(键值对)。Pair 提供了一种简单粗暴的方式处理键值关联,尤其当我们需要从方法中返回两个值时特别有用。
✅ 核心优势:
- 简化二元数据结构处理
- 避免为简单关联创建自定义类
- 提高方法返回值的灵活性
Java 核心库已提供基础实现,此外像 Apache Commons 和 Vavr 等第三方库也暴露了类似功能。
2. 核心 Java 实现
2.1. Pair 类
在 javafx.util
包下可以直接使用 Pair
类。其构造方法接收两个参数:键和对应值:
Pair<Integer, String> pair = new Pair<>(1, "One");
Integer key = pair.getKey();
String value = pair.getValue();
这个例子展示了用 Pair 实现 Integer 到 String 的简单映射。
如代码所示:
- 通过
getKey()
获取键 - 通过
getValue()
获取值
⚠️ 注意:虽然来自 JavaFX 包,但即使不使用 JavaFX 也能独立使用这个类。
2.2. AbstractMap.SimpleEntry 和 AbstractMap.SimpleImmutableEntry
SimpleEntry
是 AbstractMap
的嵌套类,创建时直接传入键值对:
AbstractMap.SimpleEntry<Integer, String> entry
= new AbstractMap.SimpleEntry<>(1, "one");
Integer key = entry.getKey();
String value = entry.getValue();
可通过标准 getter/setter 访问键值。
AbstractMap
还提供了不可变版本 SimpleImmutableEntry
:
AbstractMap.SimpleImmutableEntry<Integer, String> entry
= new AbstractMap.SimpleImmutableEntry<>(1, "one");
❌ 踩坑提醒:尝试修改 SimpleImmutableEntry
的值会抛出 UnsupportedOperationException
。
3. Apache Commons 实现
在 Apache Commons 库中,Pair
位于 org.apache.commons.lang3.tuple
包。这是个抽象类,不能直接实例化。
其两个子类提供具体实现:
ImmutablePair
(不可变)MutablePair
(可变)
都支持键值 getter/setter:
ImmutablePair<Integer, String> pair = new ImmutablePair<>(2, "Two");
Integer key = pair.getKey();
String value = pair.getValue();
❌ 对不可变版本调用 setValue()
会抛出异常。
但可变版本完全支持修改:
Pair<Integer, String> pair = new MutablePair<>(3, "Three");
pair.setValue("New Three");
4. Vavr 实现
Vavr 库通过不可变 Tuple2
类提供 Pair 功能:
Tuple2<Integer, String> pair = new Tuple2<>(4, "Four");
Integer key = pair._1();
String value = pair._2();
⚠️ 注意:创建后对象不可变,修改操作会返回新实例:
tuplePair = pair.update2("New Four");
5. 替代方案一:自定义容器类
当无法使用上述库时,最直接的解决方案是创建自定义容器类:
✅ 优势:
- 可自定义命名,避免语义混淆
- 完全控制访问权限
- 适合特定业务场景
public class CustomPair {
private String key;
private String value;
// standard getters and setters
}
6. 替代方案二:数组
另一个常见方案是用双元素数组实现类似功能:
private Object[] getPair() {
// ...
return new Object[] {key, value};
}
⚠️ 约定俗成:
- 键在索引 0
- 值在索引 1
❌ 缺点:
- 类型不安全
- 可读性差
- 容易越界访问
7. 总结
本文系统梳理了 Java 中 Pair 的多种实现方案:
方案 | 可变性 | 类型安全 | 推荐场景 |
---|---|---|---|
javafx.util.Pair | 可变 | ✅ | Java 环境 |
AbstractMap.Entry | 可选 | ✅ | 标准集合操作 |
Apache Commons | 可选 | ✅ | 已引入 Commons 的项目 |
Vavr Tuple2 | 不可变 | ✅ | 函数式编程场景 |
自定义容器类 | 可控 | ✅ | 业务语义明确时 |
数组 | 可变 | ❌ | 简单临时场景(不推荐) |
✅ 最佳实践建议:
- 优先使用标准库实现(如
AbstractMap.SimpleEntry
) - 函数式场景考虑 Vavr
- 业务关联强时使用自定义类
- 避免使用数组方案(除非临时调试)
本文所有代码示例可在 GitHub 仓库 获取完整实现。