Java 三方库 Guava 详解
1、Guava 概述
Guava 是 Google 开发的 Java 核心库,提供了大量实用的工具类和扩展,旨在提高 Java 开发效率和代码质量。Guava 包含了集合、缓存、并发、字符串处理、函数式编程等多个模块,是 Java 开发者必备的工具库之一。
核心模块:
- com.google.common.collect:集合工具类
- com.google.common.cache:缓存工具类
- com.google.common.util.concurrent:并发工具类
- com.google.common.base:基础工具类
- com.google.common.io:IO 工具类
- com.google.common.primitives:基本类型工具类
引入依赖:
dependencies {
implementation 'com.google.guava:guava:32.1.3-jre'
} Guava 的优势:
- 提供了大量 JDK 没有的实用工具类
- 代码质量高,经过 Google 内部大规模验证
- API 设计优雅,易于使用
- 性能优化,减少重复造轮子
- 文档完善,社区活跃
2、集合工具类
2.1、不可变集合
Guava 提供了不可变集合,保证集合的不可变性:
// 创建不可变集合
ImmutableList<String> list = ImmutableList.of("a", "b", "c");
ImmutableSet<String> set = ImmutableSet.of("a", "b", "c");
ImmutableMap<String, Integer> map = ImmutableMap.of("a", 1, "b", 2);
// 从现有集合创建
List<String> mutableList = new ArrayList<>(Arrays.asList("a", "b", "c"));
ImmutableList<String> immutableList = ImmutableList.copyOf(mutableList);
// 使用 Builder 创建
ImmutableMap<String, Integer> map = ImmutableMap.<String, Integer>builder()
.put("a", 1)
.put("b", 2)
.put("c", 3)
.build();
2.2、新的集合类型
// Multiset:可重复元素的集合
Multiset<String> multiset = HashMultiset.create();
multiset.add("a", 3); // 添加 3 个 "a"
multiset.add("b", 2);
System.out.println(multiset.count("a")); // 输出:3
// Multimap:一个键对应多个值
Multimap<String, Integer> multimap = ArrayListMultimap.create();
multimap.put("a", 1);
multimap.put("a", 2);
multimap.put("b", 3);
System.out.println(multimap.get("a")); // 输出:[1, 2]
// BiMap:双向映射
BiMap<String, Integer> biMap = HashBiMap.create();
biMap.put("a", 1);
biMap.put("b", 2);
System.out.println(biMap.inverse().get(1)); // 输出:"a"
// Table:表格结构
Table<String, String, Integer> table = HashBasedTable.create();
table.put("row1", "col1", 1);
table.put("row1", "col2", 2);
System.out.println(table.get("row1", "col1")); // 输出:1
2.3、集合工具方法
// Lists 工具类
List<String> list = Lists.newArrayList("a", "b", "c");
List<List<String>> partitions = Lists.partition(list, 2); // 分割列表
List<String> reversed = Lists.reverse(list); // 反转列表
// Sets 工具类
Set<String> set1 = Sets.newHashSet("a", "b", "c");
Set<String> set2 = Sets.newHashSet("b", "c", "d");
Set<String> union = Sets.union(set1, set2); // 并集
Set<String> intersection = Sets.intersection(set1, set2); // 交集
Set<String> difference = Sets.difference(set1, set2); // 差集
// Maps 工具类
Map<String, Integer> map = Maps.newHashMap();
map.put("a", 1);
map.put("b", 2);
Map<String, String> transformed = Maps.transformValues(map, Object::toString);
3、缓存和并发工具
3.1、本地缓存
Guava Cache 提供了强大的本地缓存功能:
// 创建缓存
Cache<String, String> cache = CacheBuilder.newBuilder()
.maximumSize(1000) // 最大缓存数量
.expireAfterWrite(10, TimeUnit.MINUTES) // 写入后过期
.expireAfterAccess(5, TimeUnit.MINUTES) // 访问后过期
.build();
// 使用缓存
cache.put("key", "value");
String value = cache.getIfPresent("key");
// 使用 CacheLoader 自动加载
LoadingCache<String, String> loadingCache = CacheBuilder.newBuilder()
.maximumSize(1000)
.build(new CacheLoader<String, String>() {
@Override
public String load(String key) throws Exception {
return loadFromDatabase(key);
}
});
// 自动加载缓存
String value = loadingCache.get("key");
// 缓存统计
CacheStats stats = loadingCache.stats();
System.out.println("命中率:" + stats.hitRate());
3.2、并发工具
// ListenableFuture:可监听的 Future
ListeningExecutorService executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
ListenableFuture<String> future = executor.submit(() -> "result");
// 添加回调
Futures.addCallback(future, new FutureCallback<String>() {
@Override
public void onSuccess(String result) {
System.out.println("成功:" + result);
}
@Override
public void onFailure(Throwable t) {
System.out.println("失败:" + t.getMessage());
}
}, executor);
// RateLimiter:限流器
RateLimiter rateLimiter = RateLimiter.create(10.0); // 每秒 10 个请求
if (rateLimiter.tryAcquire()) {
// 执行操作
}
// EventBus:事件总线
EventBus eventBus = new EventBus();
eventBus.register(new Object() {
@Subscribe
public void handleEvent(String event) {
System.out.println("收到事件:" + event);
}
});
eventBus.post("Hello Event");
4、其他实用工具
4.1、字符串处理
// Joiner:字符串连接器
String joined = Joiner.on(",").join(Arrays.asList("a", "b", "c"));
// 输出:"a,b,c"
String joinedWithNull = Joiner.on(",").skipNulls().join(Arrays.asList("a", null, "c"));
// 输出:"a,c"
// Splitter:字符串分割器
List<String> parts = Splitter.on(",").splitToList("a,b,c");
// 输出:["a", "b", "c"]
List<String> trimmed = Splitter.on(",").trimResults().splitToList("a, b, c");
// 输出:["a", "b", "c"]
// Strings:字符串工具
String padded = Strings.padEnd("abc", 5, 'x'); // 输出:"abcxx"
String nullToEmpty = Strings.nullToEmpty(null); // 输出:""
boolean isNullOrEmpty = Strings.isNullOrEmpty(""); // 输出:true
4.2、前置条件检查
// Preconditions:前置条件检查
public void process(String name, int age) {
// 检查参数不为 null
Preconditions.checkNotNull(name, "name 不能为 null");
// 检查条件
Preconditions.checkArgument(age > 0, "age 必须大于 0");
Preconditions.checkArgument(age < 150, "age 必须小于 150,实际值:%s", age);
// 检查状态
Preconditions.checkState(isInitialized, "服务未初始化");
// 检查索引
Preconditions.checkElementIndex(index, list.size(), "索引越界");
}
4.3、Optional 类
// Optional:避免 null
Optional<String> optional = Optional.of("value");
Optional<String> nullable = Optional.fromNullable(mayBeNull);
// 使用 Optional
if (optional.isPresent()) {
String value = optional.get();
}
String value = optional.or("default");
String value = optional.orNull();
String value = optional.or(() -> computeDefault());
4.4、函数式编程
// Function:函数式接口
Function<String, Integer> lengthFunction = String::length;
List<Integer> lengths = Lists.transform(strings, lengthFunction);
// Predicate:谓词接口
Predicate<String> isEmpty = String::isEmpty;
List<String> nonEmpty = Lists.newArrayList(Iterables.filter(strings, isEmpty.negate()));
// 组合函数
Function<String, String> upperCase = String::toUpperCase;
Function<String, String> trim = String::trim;
Function<String, String> composed = Functions.compose(upperCase, trim);
String result = composed.apply(" hello "); // 输出:"HELLO"
Guava 是 Java 开发中不可或缺的工具库,提供了大量实用的工具类和扩展。通过合理使用 Guava,可以显著提高开发效率,减少重复代码,提升代码质量。掌握 Guava 的核心功能,对于 Java 开发者来说非常重要。