引入依赖
<!-- 显式声明,优先级高于 commons-text 传递进来的版本 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.20.0</version>
</dependency>
Pair、Triple、Range
JDK 至今没有官方的 Pair,这是 Commons Lang 最有价值的补充之一。
import org.apache.commons.lang3.tuple.Pair;
import org.apache.commons.lang3.tuple.Triple;
import org.apache.commons.lang3.Range;
// ===== Pair:不可变,线程安全 =====
Pair<String, Integer> p = Pair.of("张三", 28);
p.getLeft(); // "张三"
p.getRight(); // 28
p.getKey(); // 等价于 getLeft,因为 Pair 实现了 Map.Entry
p.getValue(); // 等价于 getRight
// ImmutablePair 与 MutablePair
ImmutablePair<String, Integer> ip = ImmutablePair.of("a", 1); // 不可变
MutablePair<String, Integer> mp = MutablePair.of("a", 1);
mp.setRight(2); // 可变
// 常用于方法返回两个值
public Pair<Boolean, String> validate(String input) {
if (StringUtils.isBlank(input)) {
return Pair.of(false, "不能为空");
}
return Pair.of(true, "OK");
}
// ===== Triple =====
Triple<String, Integer, LocalDate> t = Triple.of("张三", 28, LocalDate.of(1998, 1, 1));
t.getLeft(); t.getMiddle(); t.getRight();
// ===== Range:闭区间 [from, to] =====
// ⚠️ Range.of 是正确写法;旧的 Range.between 在 3.13 起已废弃
Range<Integer> score = Range.of(0, 100);
score.contains(85); // true
score.contains(150); // false
score.isAfter(200); // true,整个区间在 200 之后
score.isBefore(-5); // false
score.getMinimum(); // 0
score.getMaximum(); // 100
score.fit(150); // 100 —— 把值约束到区间内,非常好用
score.fit(-10); // 0
score.containsRange(Range.of(20, 30)); // true,是否包含另一个区间
score.isAfterRange(Range.of(-50, -10)); // true,整个区间在另一区间之后
// ⚠️ Range 只 implements Serializable,没有实现 Iterable,不能 for-each 遍历
// 字符串区间
Range<String> letters = Range.of("a", "f");
letters.contains("c"); // true
// 日期区间
Range<LocalDate> period = Range.of(LocalDate.of(2026, 1, 1), LocalDate.of(2026, 12, 31));
period.contains(LocalDate.now());
// 自定义比较器
Range<User> byAge = Range.of(youngest, oldest, Comparator.comparingInt(User::age));
// 业务场景:分段计费
public BigDecimal calcFee(int usage) {
if (Range.of(0, 100).contains(usage)) return BigDecimal.valueOf(usage).multiply(RATE_LOW);
if (Range.of(101, 1000).contains(usage)) return BigDecimal.valueOf(usage).multiply(RATE_MID);
return BigDecimal.valueOf(usage).multiply(RATE_HIGH);
}
Range.fit(value)是被严重低估的方法。做参数钳制(clamp)时,它比手写Math.max(min, Math.min(max, v))清晰得多。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/weixin_42614150/article/details/164743245



