Google Guava 是一套由 Google 开发的高性能、高质量 Java 工具类库,旨在简化 Java 开发中的常见任务 ,提升代码可读性、健壮性和性能。它不仅仅是一个"工具箱",更是一套经过生产验证的最佳实践集合。
🧰 Guava 核心能力概览(6大模块)
| 模块类别 | 解决什么问题 | 代表类/接口 | 最简示例 |
|---|---|---|---|
| 基础工具(Basic Utilities) | 简化 null 判断、前置条件、对象工具等 | Preconditions, Objects, MoreObjects |
Preconditions.checkNotNull(obj) |
| 集合扩展(Collections) | 提供更强大、更安全、更高效的集合类型 | ImmutableList, Multimap, BiMap, Table |
ImmutableList.of("a", "b") |
| 缓存(Caching) | 本地内存缓存(LRU、自动加载、过期策略) | Cache, LoadingCache |
CacheBuilder.newBuilder().maximumSize(100).build() |
| 并发工具(Concurrency) | 简化 ListenableFuture、Service 管理 | ListenableFuture, Service |
Futures.addCallback(future, callback, executor) |
| 字符串处理(Strings) | 安全拼接、空值处理、拆分、填充等 | Strings, Joiner, Splitter |
Joiner.on(",").join("a", "b") → "a,b" |
| I/O 工具(I/O) | 读写文件、流处理更简洁可靠 | Files, ByteSource, CharSink |
Files.readLines(file, UTF_8) |
1️⃣ 基础工具(Basic Utilities)
✅ 作用
- 避免
NullPointerException - 标准化参数校验、对象
hashCode/toString/equals
📌 示例
java
// 参数校验
public void setName(String name) {
this.name = Preconditions.checkNotNull(name, "name 不能为 null");
}
// 安全的 toString
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("id", id)
.add("name", name)
.toString();
}
2️⃣ 集合扩展(Collections)
Guava 提供了不可变集合 和新型集合抽象,避免意外修改、提升性能。
| 类型 | 用途 | 示例 |
|---|---|---|
ImmutableList/Set/Map |
创建不可变集合(线程安全) | ImmutableList.of(1, 2, 3) |
Multimap |
一个 key 对应多个 value | multimap.put("a", 1); multimap.put("a", 2); |
BiMap |
双向映射(key ↔ value 唯一) | biMap.inverse().get(value) |
Table<R, C, V> |
二维表结构(行×列→值) | table.put(row, col, value) |
📌 示例
java
// 不可变列表(推荐替代 Arrays.asList)
List<String> safeList = ImmutableList.of("x", "y");
// 一个key多个值
Multimap<String, Integer> scores = ArrayListMultimap.create();
scores.put("数学", 90);
scores.put("数学", 85);
System.out.println(scores.get("数学")); // [90, 85]
3️⃣ 缓存(Caching)
替代手写 ConcurrentHashMap + 手动过期,提供自动加载、大小限制、过期策略。
📌 示例
java
LoadingCache<String, User> userCache = CacheBuilder.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build(new CacheLoader<String, User>() {
public User load(String userId) {
return loadUserFromDB(userId); // 自动加载
}
});
User user = userCache.get("123"); // 若不存在,自动调用 load()
4️⃣ 并发工具(Concurrency)
简化异步编程,特别是 ListenableFuture(带回调的 Future)。
📌 示例
java
ListenableFuture<String> future = executor.submit(() -> "Hello");
Futures.addCallback(future, new FutureCallback<String>() {
@Override
public void onSuccess(String result) {
System.out.println("结果: " + result);
}
@Override
public void onFailure(Throwable t) {
t.printStackTrace();
}
}, executor);
⚠️ 注:Java 8+ 中
CompletableFuture更常用,但 Guava 的ListenableFuture在旧项目或特定生态(如 gRPC)中仍有价值。
5️⃣ 字符串处理(Strings)
避免 StringUtils 依赖,安全处理 null 和空字符串。
📌 示例
java
// 拼接(自动跳过 null)
String result = Joiner.on(",").skipNulls().join("a", null, "b"); // "a,b"
// 拆分(保留空串)
List<String> parts = Splitter.on(',')
.trimResults()
.omitEmptyStrings()
.splitToList("a, , b"); // ["a", "b"]
// 空安全
String safe = Strings.nullToEmpty(null); // ""
boolean isEmpty = Strings.isNullOrEmpty(str);
6️⃣ I/O 工具(I/O)
简化文件读写,避免资源泄漏。
📌 示例
java
// 读取所有行
List<String> lines = Files.readLines(new File("log.txt"), StandardCharsets.UTF_8);
// 写入文件
Files.write("Hello Guava".getBytes(StandardCharsets.UTF_8), file);
⚠️ 注意:Guava 的 I/O 工具在 Java 7+ 后部分被
java.nio.file取代,但在简单场景仍很简洁。
✅ 整体认知图谱
Guava
├── 基础工具 → 安全、健壮(Preconditions, Objects)
├── 集合扩展 → 更表达力、不可变(Immutable*, Multimap, BiMap, Table)
├── 缓存 → 本地内存缓存(CacheBuilder)
├── 并发 → 异步回调(ListenableFuture)
├── 字符串 → 安全拼接拆分(Joiner, Splitter, Strings)
└── I/O → 简洁文件操作(Files)
🔚 总结
- Guava 不是"银弹",但能显著减少样板代码。
- 优先使用不可变集合(防 bug、线程安全)。
- 缓存、集合、字符串 是最常用三大模块。
- 与 Java 8+ 特性互补 :例如
Optional替代部分 null 处理,Stream替代部分集合操作,但 Guava 的Multimap、Table仍是独特优势。
💡 建议:在新项目中按需引入(如只用
ImmutableList+Preconditions),避免全量依赖。
如需某个模块的深入示例(如 Table 做交叉统计、Cache 带刷新策略),可继续提问!