简单来说,Apache Commons Lang 是一个提供了大量Java标准库(java.lang
及其周边)增强功能的工具类库。它封装了许多常用但JDK本身没有提供的实用方法,旨在让Java开发更高效、代码更简洁、更健壮。
核心概述
- 官方名称: Apache Commons Lang
- 最新主流版本: Commons Lang 3 (这是一个与老版本 Lang 2 不兼容的重大升级,建议新项目直接使用 3)
- 作用: 填补 JDK 在基础数据处理、方法调用、并发、文本操作等方面的不足,提供了大量"开箱即用"的静态工具方法。
- 设计理念: 提供高质量、可重用、线程安全的工具类,所有方法都是静态的。
为什么开发者喜欢用它?
因为它解决了日常开发中非常多"琐碎的痛点",你很可能写过它里面已经实现的方法。使用它可以:
- 避免"重复造轮子": 你不用再自己写字符串是否为空的判断、对象toString、equals和hashCode方法等。
- 提高代码健壮性 (Null-Safe) : 库中的许多方法都进行了安全的
null
值检查,避免了烦人的NullPointerException
。 - 使代码更简洁、可读性更强 : 一行清晰的工具方法调用可以替代多行的
if-else
判断和循环。 - 遵循最佳实践: 这些工具类由社区顶尖开发者维护和评审,实现了高效、可靠的算法。
它提供了哪些常用功能?(附代码示例)
以下是一些最常用和核心的类及其功能:
1. StringUtils
- 字符串工具类 (使用频率最高)
处理 null
安全的字符串操作。
java
// 判断字符串是否为空或空白 (优于 if(str != null && !str.isEmpty()))
StringUtils.isEmpty(null); // true
StringUtils.isEmpty(""); // true
StringUtils.isEmpty(" "); // false
StringUtils.isBlank(" "); // true (会trim空格)
// 截取、查找、反转等操作都是null安全的
StringUtils.substring("Hello", 2); // "llo"
StringUtils.substring(null, 2); // null (不会抛NPE)
StringUtils.reverse("ABC"); // "CBA"
// 判断字符串是否包含某字符,忽略大小写
StringUtils.containsIgnoreCase("Apple", "APP"); // true
// 用指定字符串连接数组元素
StringUtils.join(new String[]{"a", "b", "c"}, ","); // "a,b,c"
2. ObjectUtils
- 对象工具类
安全地操作对象。
java
// 第一个非空对象
ObjectUtils.defaultIfNull(nullObject, "defaultValue");
// 安全的toString,对象为null时返回指定字符串
ObjectUtils.toString(null); // "null"
ObjectUtils.toString(null, "ERROR"); // "ERROR"
// 比较两个对象 (null-safe)
ObjectUtils.equals(object1, object2); // 等效于 java.util.Objects.equals()
3. ArrayUtils
- 数组工具类
提供了标准JDK数组类所没有的功能。
java
// 判断数组是否为空
ArrayUtils.isEmpty(new String[]{}); // true
ArrayUtils.isEmpty(null); // true
// 向数组添加元素 (返回新数组)
String[] array = {"a", "b"};
array = ArrayUtils.add(array, "c"); // ["a", "b", "c"]
// 反转数组
ArrayUtils.reverse(array); // 变为 ["c", "b", "a"]
// 检查是否包含某个元素
ArrayUtils.contains(array, "b"); // true
4. RandomUtils
和 RandomStringUtils
生成随机数和随机字符串。
java
// 生成指定范围内的随机int/long
int randomInt = RandomUtils.nextInt(1, 100);
// 生成随机字符串
String randomAlphabetic = RandomStringUtils.randomAlphabetic(10); // 10个字母
String randomNumeric = RandomStringUtils.randomNumeric(6); // 6位数字
5. SystemUtils
获取系统属性,方便跨平台。
java
// 判断Java版本
SystemUtils.IS_JAVA_8; // 是否是Java 8
SystemUtils.IS_JAVA_11; // 是否是Java 11
// 判断操作系统
SystemUtils.IS_OS_WINDOWS;
SystemUtils.IS_OS_LINUX;
6. 构建器:EqualsBuilder
, HashCodeBuilder
, ToStringBuilder
帮助快速、正确地重写 equals()
, hashCode()
, 和 toString()
方法,避免了手动编写容易出错的代码。
java
public class Person {
private String name;
private int age;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return new EqualsBuilder()
.append(age, person.age)
.append(name, person.name)
.isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder(17, 37)
.append(name)
.append(age)
.toHashCode();
}
@Override
public String toString() {
return new ToStringBuilder(this)
.append("name", name)
.append("age", age)
.toString();
}
}
如何在项目中使用?
如果你的项目使用 Maven ,在 pom.xml
中添加以下依赖即可:
xml
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.14.0</version> <!-- 请检查并使用最新版本 -->
</dependency>
如果使用 Gradle:
gradle
implementation 'org.apache.commons:commons-lang3:3.14.0'
总结
Apache Commons Lang 是Java开发者工具箱中一件不可或缺的"瑞士军刀" 。它极大地简化了基础代码的编写,提高了开发效率和代码质量。虽然现代JDK(如 Java 8+ 的 java.util.Objects
)也吸收了一些类似思想,但 Commons Lang 在广度和深度上依然远超JDK,是绝大多数Java项目的标准基础依赖。