Guava教程:Google工程师的“Java糖果罐“

目录

    • Guava是什么?
    • 6颗最甜的Guava"糖果"
      • 1️⃣ 集合工具:比JDK更聪明的容器
      • 2️⃣ 不可变集合:防御式编程利器
      • 3️⃣ 函数式编程:让Java也能优雅
      • 4️⃣ 字符串处理:比Apache Commons更流畅
      • 5️⃣ 缓存工具:比HashMap更专业
      • 6️⃣ 原生类型处理:告别int与Integer的纠结
    • Guava vs 原生JDK对比
    • Guava最佳实践
      • 1. 防御性编程
      • 2. 优雅的参数校验
      • 3. Stopwatch计时器
      • 4. 数学工具
    • ⚠️ 注意事项
    • 为什么选择Guava?

“又写if(list != null && !list.isEmpty())?这种代码我快写吐了!” 别急!今天给你介绍Google工程师们私藏的Guava工具包——它就像装满各种美味糖果的罐子,能让你的Java代码甜度飙升,苦味全无!

Guava是什么?

Guava是Google开源的Java核心库,包含:

  • 集合增强(比JDK更聪明的容器)
  • 函数式编程(让Java也能优雅)
  • 缓存工具(比HashMap更专业的缓存)
  • 字符串处理(告别StringUtils的繁琐)

…等数百个实用工具方法!


<dependency>
    <groupId>com.google.guavagroupId>
    <artifactId>guavaartifactId>
    <version>32.1.3-jreversion>
dependency>

6颗最甜的Guava"糖果"

1️⃣ 集合工具:比JDK更聪明的容器

// 传统JDK集合
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("a"); // 允许重复

// Guava的超级集合
Multiset<String> multiset = HashMultiset.create();
multiset.add("a", 2); // 直接添加2个"a"
multiset.count("a"); // 返回2 → 统计元素出现次数

更多甜蜜操作:

// 双向Map(键值都能查)
BiMap<String, Integer> biMap = HashBiMap.create();
biMap.put("Alice", 1);
biMap.inverse().get(1); // 返回"Alice"

// 多重Map(一键多值)
Multimap<String, String> multimap = ArrayListMultimap.create();
multimap.put("fruit", "apple");
multimap.put("fruit", "banana");
multimap.get("fruit"); // ["apple", "banana"]

2️⃣ 不可变集合:防御式编程利器

// 传统"不可变"集合(其实还能改!)
List<String> list = Collections.unmodifiableList(new ArrayList<>());
list.add("oops"); // 运行时抛出UnsupportedOperationException

// 真正的不可变集合(编译期就安全)
ImmutableList<String> imList = ImmutableList.of("a", "b", "c");
imList.add("oops"); // 直接编译报错!

3️⃣ 函数式编程:让Java也能优雅

// 传统过滤写法
List<Integer> filtered = new ArrayList<>();
for (Integer num : numbers) {
    if (num % 2 == 0) filtered.add(num);
}

// Guava函数式写法
Iterables.filter(numbers, num -> num % 2 == 0);

// 自定义函数对象
Function<String, Integer> lengthFunc = new Function<>() {
    public Integer apply(String input) {
        return input.length();
    }
};
Collections2.transform(list, lengthFunc); // 转换集合元素

注意:Java 8后可以用Stream API,但Guava在Java 7及以下环境仍是救星!

4️⃣ 字符串处理:比Apache Commons更流畅

// 拼接字符串
String joined = Joiner.on("|").skipNulls().join("a", null, "b"); // "a|b"

// 拆分字符串(超强容错)
Splitter.on(',')
    .trimResults()
    .omitEmptyStrings()
    .split("a,,b, c"); // ["a", "b", "c"]

// 字符匹配
CharMatcher.digit().retainFrom("a1b2c3"); // "123"

5️⃣ 缓存工具:比HashMap更专业

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);
        }
    });

// 使用缓存(不存在时自动调用load)
User user = userCache.get("user123");

6️⃣ 原生类型处理:告别int与Integer的纠结

// 传统数组处理
int[] array = {1, 2, 3};
Arrays.asList(array); // 悲剧!得到List而非List

// Guava的救赎
List<Integer> list = Ints.asList(1, 2, 3); // 完美转换
int[] array2 = Ints.toArray(list); // 反向转换
Ints.compare(1, 2); // 安全的原生类型比较

Guava vs 原生JDK对比

场景 JDK写法 Guava写法 优势
集合初始化 Arrays.asList(“a”, “b”, “c”) ImmutableList.of(“a”, “b”) 真正不可变
字符串拼接 String.join(“,”, list) Joiner.on("\t").join(list) 支持跳过null
缓存实现 HashMap + 手动过期逻辑 CacheBuilder 自动过期/淘汰策略
多重Map Map Multimap API更直观

Guava最佳实践

1. 防御性编程

// 方法返回不可变集合
public ImmutableList<String> getConfigs() {
    return ImmutableList.copyOf(rawConfigs);
}

2. 优雅的参数校验

public void process(String input) {
    Preconditions.checkNotNull(input, "input不能为null");
    Preconditions.checkArgument(input.length() > 5, "input长度需大于5");
}

3. Stopwatch计时器

Stopwatch stopwatch = Stopwatch.createStarted();
doSomething();
long millis = stopwatch.elapsed(TimeUnit.MILLISECONDS);

4. 数学工具

int min = Ints.min(1, 3, 5); // 1
double mean = DoubleMath.mean(10.0, 20.0); // 15.0

⚠️ 注意事项

  • 不要过度使用:Java 8+的Stream API已经实现部分功能
  • 版本兼容性:Android项目需使用guava-android
  • 性能敏感处测试:部分工具类有额外对象创建开销
// 不推荐在超高频循环中使用
for (int i = 0; i < 1_000_000; i++) {
    Strings.isNullOrEmpty(str); // 有微小开销
}

为什么选择Guava?

  • Google生产验证:支撑YouTube、Gmail等亿级应用
  • 代码更简洁:减少30%样板代码
  • 性能优化:专为高频场景优化的数据结构
  • 文档丰富:每个类都有详细使用示例

小菜:“那我该优先学习Guava的哪部分?”

老鸟:“先吃透Collections和Strings工具类,它们就像糖果罐里的巧克力——最常用也最美味!”

行动清单:

  • 在项目中引入Guava依赖
  • 用Preconditions替换所有参数校验
  • 尝试用Multimap改造现有的Map
  • 用CacheBuilder实现本地缓存

记住:Guava不是银弹,但绝对是Java开发者的"瑞士军刀"。现在就去品尝这些"代码糖果"吧!

你可能感兴趣的:(Java类库,guava,java)