当前位置: 首页 > news >正文

Java里的Google Guava集合类库怎么用

Guava不可变集合无public结构器,必须通过静态工厂创建,如Immutablelistt等.of()或copyof(),修改操作抛unsupportedoperationexception;Multimap简化嵌套列表管理;Stream直接collecttttam(ImmutableList.toImmutableList());JDK21Imutablelist没有实现 SequencedCollection。

ImmutableList、ImmutableSet 为什么不能直接? new

Guava 不可变集合不依赖 final 装饰的普通集合,而是全新结构的只读实现。你写的new ImmutableList()会编译失败-它没有 public 构造器。

正确的入口只有静态工厂方法,核心是「构建即冻结」逻辑:一旦生成,任何修改操作(如add()remove())都会抛UnsupportedOperationException

  • ImmutableList.of("a", "b")最多创建小固定集合(创建小固定集合( 5 个元素)
  • 超过 5 个或需要从现有集合转换,使用ImmutableList.copyOf(list);注意传入 null 会直接 NPE,建议先判空
  • ImmutableSet.copyOf(collection)自动去除重复元素,但不保证顺序(底层使用)ImmutableHashSet),要有序用ImmutableSortedSet

Multimap 代替 Map> 的真实代价

Map<string list>></string>手动管理嵌套列表非常麻烦:每次 put 前得检查 key 是否存在、list 是空的,是否想要 new ArrayList。而Multimap包装这件事,但代价是它不继承Map接口,不能直接做 Map 用。

  • 常用的是ArrayListMultimap.create()(值按插入顺序)和HashMultimap.create()(值无序,内存更省)
  • put("k1", 1)put("k1", 2)后,get("k1")返回是不可修改的Collection视图,不能调整clear()remove()—— 想删除一个值得使用的remove("k1", 1)
  • 若需要支持 null key 或 null value,必须选LinkedHashMultimap或显式 wrap,因为默认禁止 null

ImmutableList.copyOf() 流式处理中容易误踩坑

很多人在 Stream 后接collect(Collectors.toList()),再传给ImmutableList.copyOf(),认为双重保险。事实上,没有必要再经历一次。

  • Stream 本身有toList()(Java 16+),返回是不可变的 List,但它是 JDK 实现,和 Guava 无关;Guava 的ImmutableList.toImmutableList()是配套收集器
  • 错误写法:stream.collect(Collectors.toList()).stream().collect(ImmutableList.toImmutableList())—— 白跑两轮
  • 正确写法:stream.collect(ImmutableList.toImmutableList()),而且收集器内部做了短路优化,遇到了 null 元素会立即报告NullPointerException,直到遍历才崩溃,而不是延迟
  • 如果 stream 可能为空,toImmutableList()回来的是空的ImmutableList,不是 null,这点比自己 new ArrayList 安全

Guava 集合和 JDK 21+ SequencedCollection 的关系

Java 21 引入了SequencedCollection,让LinkedListArrayDeque支持统一getFirst()/getLast()。但它和 Guava 不可变集合没有交集——Guava 的ImmutableList这个接口没有实现,JDK 也没有让它实现的计划。

  • 这意味着:你不能正确ImmutableList调用getFirst(),即使内部是数组实现;如果你想拿起头尾,你只能用它;get(0)get(size() - 1),并自己判空
  • 如果你的代码同时依赖于它 JDK 新 API 和 Guava,例如,不要假设行为兼容;SequencedCollection.reversed()返回的是新视图,而ImmutableList.reverse()这是一个真正的反序副本,内存费用不同
  • 现在最稳定的混合方式:把手 Guava 集合作为数据源,转化为 JDK 接口(如list.stream())再进新 API 流程

不可变性和多值映射的边界非常清晰,但具体到每个工厂的方法 null 处理、空集合返回值和和 JDK 新特性的错位是写代码时真正卡住人的地方。

http://www.jsqmd.com/news/509403/

相关文章:

  • 〘 10 〙软考高项 | 第17章:项目干系人管理
  • Z-Image-GGUF多场景:支持ControlNet扩展(需额外配置),实现线稿上色控制
  • Chandra代码补全功能测评:对比Copilot的实际效果
  • Pixel Mind Decoder 成本优化实践:按需伸缩与Spot实例节省GPU费用
  • Qwen3-ASR实时转录效果展示:会议记录实战演示
  • Qwen3.5-9B企业级部署方案:支持高并发的Gradio服务容器化实践
  • 用过才敢说! 更贴合全场景通用的降AI率工具,千笔·降AIGC助手 VS 灵感ai
  • Phi-4-reasoning-vision-15B应用案例:保险理赔单据OCR+字段校验自动化
  • ESP32无人机远程识别模块:开源合规解决方案完整指南
  • Spec Kit 鉴权问题与本地化解决方案
  • 芯片制造企业OA系统如何通过百度编辑器实现CAD图纸粘贴?
  • 基于注意力机制YOLO的异常行为识别:打架/跌倒检测系统实战
  • 嵌入式超时机制设计:Tick差值法与回调注册法实战
  • SOONet模型计算机组成原理视角下的推理性能优化
  • CTF编码解密
  • 百川2-13B-4bits量化版GPU算力适配:24GB显存利用率87.5%稳定运行实录
  • 2026天津高端养老院评测及国寿嘉园选购指南 - 优质品牌商家
  • 3步驯服电视盒子:TVBoxOSC如何重构家庭媒体中心体验
  • Pixel Dimension Fissioner开发者案例:为低代码平台添加‘文案智能升级’模块
  • 导轨式液压升降货梯
  • 解决Windows APK安装难题:APK-Installer轻量工具让安卓应用轻松运行
  • 汽车制造行业B端系统集成百度UM时如何解决表格粘贴错位?
  • deactivate: command not found, You’re in a new shell or never activated the venv here.
  • gte-base-zh离线环境部署:无外网服务器下Xinference+gte-base-zh完全离线安装
  • 如何用MCP彻底重构VS Code开发体验?一线架构师压箱底的6项自动化调试技巧
  • LangGraph 多步推理:State + Node + 条件路由,手写 StateGraph
  • LiquidCrystalWired:面向工业级应用的HD44780 LCD驱动库
  • 百考通:AI赋能答辩PPT,智能生成优质内容,让学术展示更高效从容
  • 苍穹外卖01学习整理
  • 零基础掌握PowerShell脚本编译:Win-PS2EXE可视化工具全指南