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

SimpleEntryAbstractMap 的嵌套类,创建时直接传入键值对:

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 不可变 函数式编程场景
自定义容器类 可控 业务语义明确时
数组 可变 简单临时场景(不推荐)

✅ 最佳实践建议:

  1. 优先使用标准库实现(如 AbstractMap.SimpleEntry
  2. 函数式场景考虑 Vavr
  3. 业务关联强时使用自定义类
  4. 避免使用数组方案(除非临时调试)

本文所有代码示例可在 GitHub 仓库 获取完整实现。


原始标题:Using Pairs in Java

» 下一篇: EGit 完全指南