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[] 装箱转换
什么时候不用它
三个诚实的提醒:
- 别用它替代专门的库。日期处理该用
java.time或 date-fns 思路的库,集合处理CollectionUtils(commons-collections)更对口——Lang3 里的DateUtils、集合相关方法是历史包袱,不是最佳实践。 - JDK 8+ 已经补了不少。
Optional、String.join、Objects.requireNonNull出现后,有些场景原生 API 足够,别为了用工具类而用。 - 工具方法调用嵌套别太深。
StringUtils链三层以上就该抽个有业务含义的方法了,可读性才是工具类的意义。
小结
Commons Lang3 的定位是「JDK 基础类型的顺手补充」,核心记忆点三个:StringUtils 的 null 安全与 isBlank、NumberUtils.toInt 的失败给默认值、ObjectUtils.firstNonNull 的多级兜底。它是那种不显眼、但依赖树里少了它你会自己重写一堆工具方法的库。
Commons Lang3 入门:Java 工具库的瑞士军刀
http://www.clxhxhhr.top/posts/3709/ 评论
0 条
还没有评论,先写一条吧。