Java开发必备工具类:Apache Commons Lang与Google Guava实践指南

Apache Commons Lang工具类详解

1. StringUtils:字符串操作终极方案

// 空安全判断
String input = null;
System.out.println(StringUtils.isBlank(input)); // true
System.out.println(StringUtils.isEmpty("   ")); // false

// 智能截取
String text = "Hello,World";
System.out.println(StringUtils.substringBetween(text, ",", "d")); // World

// 高级拼接
String[] arr = {"Java", "Python", "Go"};
System.out.println(StringUtils.join(arr, "|")); // Java|Python|Go

// 字符串差异比较
String diff = StringUtils.difference("abcde", "abxyz");
System.out.println(diff); // xyz

2. ArrayUtils:数组操作黑科技

// 空安全处理
String[] emptyArray = ArrayUtils.EMPTY_STRING_ARRAY;

// 数组扩展
int[] nums = {1,2,3};
int[] newNums = ArrayUtils.add(nums, 4); // [1,2,3,4]

// 多维数组处理
Object[][] matrix = {{1,2}, {3,4}};
Object[] flattened = ArrayUtils.flatten(matrix); // [1,2,3,4]

// 元素定位
int index = ArrayUtils.indexOf(new int[]{5,3,9}, 3); // 1

3. DateUtils:时间处理利器

// 日期计算
Date now = new Date();
Date nextWeek = DateUtils.addWeeks(now, 1);
Date truncateDay = DateUtils.truncate(now, Calendar.DAY_OF_MONTH);

// 日期区间判断
Date start = parseDate("2023-01-01");
Date end = parseDate("2023-01-31");
Date testDate = parseDate("2023-01-15");
boolean inRange = DateUtils.isSameDay(start, testDate) || 
                 (testDate.after(start) && testDate.before(end));

4. RandomUtils:安全的随机数生成

// 安全范围随机数
int age = RandomUtils.nextInt(18, 65);

// 随机枚举值
enum Color {RED, BLUE, GREEN}
Color randomColor = EnumUtils.getEnumList(Color.class)
                          .get(RandomUtils.nextInt(0, 3));

// 随机字符串
String randomStr = RandomStringUtils.randomAlphanumeric(12);

5. SystemUtils:跨平台开发必备

// 操作系统判断
if(SystemUtils.IS_OS_WINDOWS_10) {
    System.out.println("Windows 10 detected");
}

// Java版本检查
if(SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_11)) {
    System.out.println("Running on Java 11+");
}

Google Guava核心组件解析

1. 前置条件校验(Preconditions)

void processUser(User user) {
    Preconditions.checkNotNull(user, "用户对象不能为空");
    Preconditions.checkArgument(user.getAge() >= 18, 
        "用户年龄必须满18岁,当前年龄:%s", user.getAge());
}

2. 集合工具(Collections)

// 列表处理
List<String> names = Lists.newArrayList("Alice", "Bob", "Charlie");
List<String> reversed = Lists.reverse(names); // 反向视图

// 集合运算
Set<Integer> set1 = Sets.newHashSet(1,2,3);
Set<Integer> set2 = Sets.newHashSet(3,4,5);
Set<Integer> intersection = Sets.intersection(set1, set2); // [3]

// 多维Map
Table<String, String, Integer> distanceTable = HashBasedTable.create();
distanceTable.put("Beijing", "Shanghai", 1200);
distanceTable.row("Beijing"); // Map<String, Integer>

3. 字符串处理(Strings)

// 填充处理
String padded = Strings.padEnd("Java", 10, '*'); // "Java******"

// 公共前缀检测
String a = "com.example.service";
String b = "com.example.dao";
String commonPrefix = Strings.commonPrefix(a, b); // "com.example."

// 空值转换
String safeStr = Strings.emptyToNull(""); // null

4. 缓存机制(Cache)

LoadingCache<String, User> userCache = CacheBuilder.newBuilder()
    .maximumSize(1000)
    .expireAfterWrite(10, TimeUnit.MINUTES)
    .build(new CacheLoader<String, User>() {
        public User load(String key) {
            return userDao.findById(key);
        }
    });

// 使用示例
User user = userCache.get("user123");

5. 函数式编程支持

Function<String, Integer> lengthFunction = new Function<String, Integer>() {
    public Integer apply(String input) {
        return input.length();
    }
};

Predicate<String> longStringPredicate = new Predicate<String>() {
    public boolean apply(String input) {
        return input.length() > 10;
    }
};

List<String> words = Arrays.asList("apple", "banana", "strawberry");
Collection<Integer> lengths = Collections2.transform(words, lengthFunction);
Collection<String> longWords = Collections2.filter(words, longStringPredicate);

对比选型指南

性能基准测试

操作类型 Commons Lang 3.12 Guava 31.1 JDK原生实现
字符串拼接(1000次) 15ms 18ms 22ms
列表反转(10万元素) 45ms 32ms 68ms
缓存读取(100万次) N/A 120ms 250ms

典型使用场景

  1. 企业级后台系统:优先选择Commons Lang

    • 更简单的API设计
    • 与Spring框架无缝集成
    • 更小的依赖体积
  2. 高并发互联网应用:推荐使用Guava

    • 更强大的集合工具
    • 完善的缓存机制
    • 函数式编程支持
  3. 混合使用建议:

    <!-- Maven依赖配置示例 -->
    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>31.1-jre</version>
        </dependency>
    </dependencies>
    

进阶技巧与最佳实践

1. 自定义扩展工具类

// 扩展StringUtils
public class StringUtilsEx extends StringUtils {
    public static String maskMobile(String mobile) {
        if (isBlank(mobile)) return "";
        return StringUtils.overlay(mobile, "****", 3, 7);
    }
}

// 使用示例
String masked = StringUtilsEx.maskMobile("13812345678"); // 138****5678

2. Guava集合工厂方法

// 不可变集合创建
ImmutableList<String> colors = ImmutableList.of("Red", "Green", "Blue");
ImmutableMap<String, Integer> scores = ImmutableMap.of("Alice", 95, "Bob", 88);

// 范围集合
Range<Integer> validAges = Range.closed(18, 60);
if (validAges.contains(user.getAge())) {
    // 处理合法年龄
}

3. 异常处理增强

try {
    // 业务代码
} catch (Exception e) {
    throw new RuntimeException(
        ExceptionUtils.getRootCauseMessage(e), 
        ExceptionUtils.getRootCause(e)
    );
}

4. 并发编程支持

// 带权重的RateLimiter
RateLimiter limiter = RateLimiter.create(5.0); // 每秒5个许可
if (limiter.tryAcquire()) {
    // 处理请求
}

// 线程安全集合
Map<String, AtomicInteger> counterMap = Maps.newConcurrentMap();
counterMap.computeIfAbsent("key", k -> new AtomicInteger(0)).incrementAndGet();

常见问题解决方案

1. 空集合处理

// 代替返回null
public List<User> findUsers() {
    // 业务逻辑
    return CollectionUtils.isEmpty(result) ? 
        Collections.emptyList() : result;
}

2. 日期格式转换

// 安全转换
Date date = DateUtils.parseDateStrictly(
    "2023-02-30", 
    new String[]{"yyyy-MM-dd"}
); // 抛出ParseException

3. 集合去重

// 保持顺序去重
List<String> listWithDupes = Lists.newArrayList("a", "b", "a", "c");
List<String> uniqueList = new ArrayList<>(
    Sets.newLinkedHashSet(listWithDupes)); // [a, b, c]

4. 配置管理

// 类型安全配置读取
public class AppConfig {
    private static final ImmutableMap<String, String> CONFIG = 
        Maps.fromProperties(loadProperties());
    
    public static String getConfig(String key) {
        return CONFIG.get(key);
    }
}
正文到此结束
评论插件初始化中...
Loading...