java教程——初识guava(2)

发布于:2025-07-04 ⋅ 阅读:(18) ⋅ 点赞:(0)

在上一篇文章中我们学习了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()                   // 弱引用

网站公告

今日签到

点亮在社区的每一天
去签到