在上一篇文章中我们学习了guava和他的优点,下面来详细的学习一下他的集合类
Guava 核心工具类深度解析
1. Iterables 工具类详解
作用与价值
Iterables 是 Guava 提供的高效 Iterable 操作工具类,解决了 JDK 集合框架在处理非内存数据集时的痛点:
- 处理数据库查询结果等大型数据集(无法一次性加载到内存)
- 操作不支持 size() 方法的数据流
- 提供更强大的集合操作能力
核心方法及用法
方法 | 作用 | 示例 |
---|---|---|
concat() |
合并多个 Iterable | Iterables.concat(list1, list2) |
frequency() |
统计元素出现次数 | Iterables.frequency(data, "key") |
partition() |
分割集合 | Iterables.partition(data, 100) |
getFirst() |
安全获取首个元素 | Iterables.getFirst(data, null) |
getLast() |
安全获取最后元素 | Iterables.getLast(data) |
elementsEqual() |
判断集合相等 | Iterables.elementsEqual(list1, list2) |
unmodifiableIterable() |
创建不可修改视图 | Iterables.unmodifiableIterable(data) |
limit() |
限制元素数量 | Iterables.limit(data, 10) |
getOnlyElement() |
获取唯一元素 | Iterables.getOnlyElement(singleton) |
使用场景示例:
// 处理数据库查询结果集
Iterable<Record> queryResults = getDatabaseResults();
int pageSize = 50;
// 分页处理
for (List<Record> page : Iterables.partition(queryResults, pageSize)) {
processPage(page);
}
// 统计关键词出现次数
int count = Iterables.frequency(queryResults, "error");
2. FluentIterable 流式操作
作用与价值
FluentIterable 提供链式调用(fluent API)风格,使集合操作更简洁、可读性更强:
- 函数式风格操作集合
- 避免中间集合创建开销
- 延迟执行提高性能
核心方法及用法
FluentIterable.from(database.getLogs())
.filter(log -> log.getLevel() == Level.ERROR) // 过滤
.transform(Log::getMessage) // 转换
.limit(100) // 限制数量
.copyInto(new ArrayList<>()); // 结果收集
主要方法:
filter(Predicate)
:元素过滤transform(Function)
:元素转换limit(int)
:限制结果数量toList()
/toSet()
:转为集合toImmutableList()
:转为不可变集合
使用场景:
// 从多个来源收集数据并处理
FluentIterable.from(Iterables.concat(source1, source2, source3))
.filter(item -> item.getValue() > 100)
.transform(Item::getName)
.toImmutableList();
3. BiMap 双向映射
与 HashMap 的区别
特性 | HashMap | BiMap |
---|---|---|
方向性 | 单向(键→值) | 双向(键↔值) |
值唯一性 | 不要求 | 强制要求 |
反向查找 | 需遍历全表 | inverse() 直接获取 |
重复值 | 允许 | 抛异常 |
典型实现 | HashMap | HashBiMap |
核心方法详解
// 创建双向映射
BiMap<String, Integer> nameToId = HashBiMap.create();
// 添加元素 (值必须唯一)
nameToId.put("Alice", 101); // 成功
nameToId.put("Bob", 102); // 成功
nameToId.put("Alice2", 101); // 抛 IllegalArgumentException
// 强制添加 (覆盖现有值)
nameToId.forcePut("Alice2", 101); // 移除Alice的映射
// 获取反向视图
BiMap<Integer, String> idToName = nameToId.inverse();
// 值查找
String name = idToName.get(102); // "Bob"
Integer id = nameToId.get("Bob"); // 102
// 其他方法
nameToId.containsValue(101); // 检查值是否存在
nameToId.inverse().keySet(); // 获取值集合
使用场景
- 国家代码映射:国家名称 ↔ ISO代码
- 产品SKU ↔ 产品ID
- 用户ID ↔ 用户名
4. Guava Sets 工具类
与 JDK Set 的区别
功能 | JDK Set | Guava Sets |
---|---|---|
集合运算 | 无 | 支持并集/交集/差集 |
笛卡尔积 | 无 | cartesianProduct() |
幂集 | 无 | powerSet() |
过滤 | 无 | filter() |
预期大小 | 手动计算 | newHashSetWithExpectedSize() |
核心方法及用法
Set<String> set1 = Sets.newHashSet("A", "B", "C");
Set<String> set2 = Sets.newHashSet("B", "C", "D");
// 集合运算
Set<String> union = Sets.union(set1, set2); // [A,B,C,D]
Set<String> intersection = Sets.intersection(set1, set2); // [B,C]
Set<String> difference = Sets.difference(set1, set2); // [A]
// 高级操作
Set<Set<String>> powerSet = Sets.powerSet(set1); // 所有子集
Set<List<String>> cartesian = Sets.cartesianProduct(set1, set2); // 笛卡尔积
// 创建带预期大小的Set
Set<String> largeSet = Sets.newHashSetWithExpectedSize(10000);
使用场景
// 权限系统:计算角色权限
Set<Permission> adminPermissions = ...;
Set<Permission> userPermissions = ...;
// 管理员独有权限
Set<Permission> adminOnly = Sets.difference(adminPermissions, userPermissions);
// 公共权限
Set<Permission> common = Sets.intersection(adminPermissions, userPermissions);
5. MapMaker 缓存构建器
作用与演进
MapMaker 是 Guava 早期提供的并发映射构建器,用于创建具有缓存特性的映射:
- 定位:构建具有缓存特性的并发映射
- 演进:已被 CacheBuilder 取代(更强大的缓存API)
- 核心功能:
- 弱引用键/值
- 基本过期策略
- 并发控制
- 移除监听器
核心方法(旧版)
ConcurrentMap<Key, Resource> cache = new MapMaker()
.concurrencyLevel(4) // 并发级别
.weakKeys() // 弱引用