841 字
约 2 分钟
0
Commons Lang3 入门:Java 工具库的瑞士军刀

Commons Lang3 入门:Java 工具库的瑞士军刀

你写过多少遍 str != null && !str.isEmpty()?这个库的存在,就是为了把这些样板代码干掉。

它解决什么问题

JDK 的工具类一直很克制:String 的方法够基础但不够顺手,Objects 直到 Java 7 才有,判空、判等、拼接这些高频操作长期都要自己写。Apache Commons Lang3 补的就是这一层——围绕 String、数字、日期、反射、系统属性这些 JDK 基础类型,提供几百个经过千锤百炼的工具方法。

它是 Apache Commons 家族里使用率最高的一个,几乎所有正经 Java 项目的依赖树里都有它。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.14.0</version>
</dependency>

StringUtils:使用率 90% 的部分

判空是它的招牌。JDK 的 isEmpty 不管空格,isBlank 管全:

StringUtils.isEmpty("  ");    // false,有字符(空格也是字符)
StringUtils.isBlank("  ");    // true,全是空白

// 最重要的特性:null 安全,传 null 不抛 NPE
StringUtils.isBlank(null);    // true
StringUtils.isEmpty(null);    // true

null 安全这一点值回票价——写工具方法时再也不用先来一句 if (str == null)。

其他高频方法:

// 拼接:跳过 null 元素,JDK String.join 做不到
StringUtils.join(["a", null, "b"], ",");     // "a,,b"
StringUtils.joinWith(",", "a", "b");         // "a,b"

// 截断:超长加省略号,列表页摘要神器
StringUtils.abbreviate("很长的文章内容……", 20);   // "很长的文章内……"

// 默认值
StringUtils.defaultIfBlank(input, "匿名用户");

// 大小写:null 安全版
StringUtils.capitalize("java");   // "Java"
StringUtils.upperCase(null);      // null,不抛异常

NumberUtils 与 BooleanUtils

字符串转数字是另一个 NPE/NumberFormatException 重灾区:

NumberUtils.toInt("123", 0);        // 123
NumberUtils.toInt("abc", 0);        // 0 —— 失败给默认值,不抛异常
NumberUtils.toInt(null, 0);         // 0

BooleanUtils.toBoolean("yes");      // true
BooleanUtils.negate(Boolean.TRUE);  // false

处理用户输入、读配置文件、解析第三方接口返回,这类「值可能是脏的」场景,NumberUtils.toInt 的「失败给默认值」语义比裸 Integer.parseInt 舒服太多。

ObjectUtils 与 SystemUtils

// 取第一个非 null 的值:多级兜底配置一行搞定
ObjectUtils.firstNonNull(cacheValue, dbValue, defaultValue);

// SystemUtils:不写 "os.name".equals(System.getProperty(...)) 这种魔法串
if (SystemUtils.IS_OS_WINDOWS) { ... }
if (SystemUtils.IS_JAVA_17) { ... }

firstNonNull 值得单独夸:缓存 → 数据库 → 默认值这种三级取值,写出来就是一行,可读性远超两层 if。

ArrayUtils

ArrayUtils.contains(arr, "x");     // 数组包含判断
ArrayUtils.add(arr, "new");        // 追加(数组不可变,返回新数组)
ArrayUtils.isEmpty(arr);           // null 安全判空
ArrayUtils.toObject(intArr);       // int[] → Integer[] 装箱转换

什么时候不用它

三个诚实的提醒:

  1. 别用它替代专门的库。日期处理该用 java.time 或 date-fns 思路的库,集合处理 CollectionUtils(commons-collections)更对口——Lang3 里的 DateUtils、集合相关方法是历史包袱,不是最佳实践。
  2. JDK 8+ 已经补了不少。Optional、String.join、Objects.requireNonNull 出现后,有些场景原生 API 足够,别为了用工具类而用。
  3. 工具方法调用嵌套别太深。StringUtils 链三层以上就该抽个有业务含义的方法了,可读性才是工具类的意义。

小结

Commons Lang3 的定位是「JDK 基础类型的顺手补充」,核心记忆点三个:StringUtils 的 null 安全与 isBlank、NumberUtils.toInt 的失败给默认值、ObjectUtils.firstNonNull 的多级兜底。它是那种不显眼、但依赖树里少了它你会自己重写一堆工具方法的库。

Commons Lang3 入门:Java 工具库的瑞士军刀
http://www.clxhxhhr.top/posts/3709/
作者
clxstart
发布于
2026-09-25
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。