小宇宙清歡渡头像
关注

Apache Commons 完全指南:Pair、Triple、Range的使用方法

引入依赖

<!-- 显式声明,优先级高于 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

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--