news 2026/5/11 12:22:33

316. Java Stream API - 收集为 Map:使用 Collectors.toMap()

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
316. Java Stream API - 收集为 Map:使用 Collectors.toMap()

文章目录

  • 316. Java Stream API - 收集为 Map:使用 `Collectors.toMap()`
      • ✨ 基本使用方式:两个函数搞定键和值
      • ✅ 示例:构建用户缓存
      • ❗️处理重复 Key:传入合并函数
      • 🧰 高级用法:指定 Map 实现类
      • 🧵 多线程收集:使用 `toConcurrentMap()`
      • 📚 总结对比
      • 🗣 小结语句(可课堂口播):

316. Java Stream API - 收集为 Map:使用Collectors.toMap()

除了前面讲过的groupingBy()收集器,我们还有一个强大的伙伴:Collectors.toMap(),用于将 Stream 中的元素转换为一个真正的键值对映射(Map)。这一方法非常适合构建缓存、索引或者快速查找的数据结构。


✨ 基本使用方式:两个函数搞定键和值

我们先来看基础语法:

Map<K,V>map=stream.collect(Collectors.toMap(keyMapper,valueMapper));
  • keyMapper:用于生成 Map 的 key。
  • valueMapper:用于生成 Map 的 value。

⚠️ 注意:如果多个元素产生相同的 key,会抛出IllegalStateException,除非你提供合并逻辑。


✅ 示例:构建用户缓存

假设你有一个User类,每个用户有一个id,你想用id作为 key,把用户缓存起来。

recordUser(longid,Stringname){}List<User>users=List.of(newUser(1L,"Mary"),newUser(2L,"James"),newUser(3L,"Patricia"),newUser(4L,"Michael"));Map<Long,User>userCache=users.stream().collect(Collectors.toMap(User::id,Function.identity()));System.out.println("Map size = "+userCache.size());System.out.println("Keys = "+userCache.keySet());

运行结果:

Mapsize=4Keys=[1,2,3,4]
  • User::id生成 key
  • Function.identity()返回元素本身作为 value

🎯 用途:常用于缓存索引表的构建。


❗️处理重复 Key:传入合并函数

如果你预期多个元素会生成相同的 key,你需要提供一个合并函数BinaryOperator)告诉 Java 如何合并值。

我们来看下面这个示例:

Collection<String>strings=List.of("one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve");Map<Integer,String>map=strings.stream().collect(Collectors.toMap(str->str.length(),// key: 字符串长度str->str,// value: 字符串本身(s1,s2)->s1+", "+s2));// 合并函数:拼接字符串map.forEach((key,value)->System.out.println(key+" :: "+value));

输出结果:

3::one,two,six,ten4::four,five,nine5::three,seven,eight6::eleven,twelve

📌 如果不提供合并函数,会在 key 冲突时抛出异常。


🧰 高级用法:指定 Map 实现类

默认情况下,toMap()返回一个HashMap。但你也可以使用第四个参数传入你想要的 Map 类型:

TreeMap<Integer,String>sortedMap=strings.stream().collect(Collectors.toMap(str->str.length(),str->str,(s1,s2)->s1+", "+s2,TreeMap::new));System.out.println(sortedMap);

🧾 输出将是按 key 排序的:

{3=one,two,six,ten,4=four,five,nine,5=three,seven,eight,6=eleven,twelve}

🧵 多线程收集:使用toConcurrentMap()

你还可以使用Collectors.toConcurrentMap()来构建线程安全的 Map,适合并行流或多线程场景:

ConcurrentMap<Long,User>userCache=users.parallelStream().collect(Collectors.toConcurrentMap(User::id,Function.identity()));

💡 实际类型通常是ConcurrentHashMap,但规范不保证具体实现。


📚 总结对比

Collector用途支持重复 Key下游收集器控制 Map 类型
groupingBy()分组、统计、分类✅ 可选✅ 可选
toMap()映射、缓存、索引❌(需手动合并)✅ 可选
toConcurrentMap()并发安全映射❌(需手动合并)✅ 默认并发 Map

🗣 小结语句(可课堂口播):

🔊 “我们用groupingBy()做统计图、做分类。但当你需要构建键值结构,比如缓存、索引表,就轮到toMap()登场了!要注意 key 冲突的处理,避免运行时炸锅!”

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 17:52:42

Dify 2026模型微调终极指南:5步完成私有领域LLM精度提升37.2%(实测TensorRT-LLM加速对比)

第一章&#xff1a;Dify 2026模型微调的核心价值与适用边界Dify 2026版本引入了面向企业级场景的轻量级微调框架&#xff0c;其核心价值不在于替代全参数训练&#xff0c;而在于以极低算力开销实现任务对齐、领域适配与安全策略注入。该能力特别适用于需快速响应业务变化但缺乏…

作者头像 李华
网站建设 2026/5/9 12:04:47

Coqui TTS 模型下载实战:从模型选择到生产环境部署的完整指南

背景痛点&#xff1a;模型下载慢、依赖冲突&#xff0c;踩坑踩到怀疑人生 第一次把 Coqui TTS 塞进项目&#xff0c;我天真地 pip install TTS&#xff0c;然后 tts --list_models&#xff0c;结果终端卡了 3 分钟才吐出 200 多条模型名。挑中 tts_models/en/ljspeech/tacotro…

作者头像 李华
网站建设 2026/5/10 13:45:05

从零构建ESP32-C3蓝牙气象站:MicroPython与uBluetooth的实战指南

从零构建ESP32-C3蓝牙气象站&#xff1a;MicroPython与uBluetooth的实战指南 1. 项目概述与硬件准备 在物联网和智能硬件快速发展的今天&#xff0c;ESP32-C3凭借其出色的性能和丰富的功能&#xff0c;成为创客和开发者的热门选择。这款基于RISC-V架构的微控制器不仅支持Wi-F…

作者头像 李华
网站建设 2026/5/10 20:49:38

ChatGPT升级实战:从模型微调到生产环境部署的最佳实践

背景痛点&#xff1a;升级后的“甜蜜负担” ChatGPT 从 3.5 到 4o 的迭代速度堪比高铁&#xff0c;但开发者上车后才发现&#xff1a; 官方基座模型越来越“通用”&#xff0c;垂直场景想出彩必须微调&#xff0c;可官方 Fine-tune 接口最低也要 1k 条高质量样本&#xff0c;…

作者头像 李华
网站建设 2026/5/9 10:16:03

服务器机架单位 1U、2U、4U 到 42U,这些常见规格有什么区别?

今天给大家分享一个基础却极其重要的知识点——服务器的“U”单位,特别是1U、2U、4U和42U这些常见规格。 很多新同事在采购或上架设备时会问:“1U和2U到底差在哪儿?”“为什么机柜都是42U?”“高密度部署用1U好,还是2U更稳?”今天这篇帖子,就把这些问题一次性讲透。读完…

作者头像 李华