Collectors.toMap() 用法简介

Collectors.toMap()是 Java 8 Stream API 中用于将流元素收集到 Map 中的收集器。它有多种重载形式。这里主要以3个参数版做介绍,并给出其他参数版本的用法。

1. 三参数版本Collectors.toMap()

1.1 签名(处理重复键

3个参数版Collectors.toMap()方法可以处理重复键,完整签名如下:

public static <T, K, U> Collector<T, ?, Map<K,U>> toMap( Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction )

泛型参数<T, K, U>的含义:

  • T: 流中元素的类型(Type of stream elements)
  • K: 生成 Map 的键的类型(Key type)
  • U: 生成 Map 的值的类型(Ualue type)

返回值类型:Collector<T, ?, Map<K,U>>

  • 第一个T: 输入元素的类型(与流元素类型一致)
  • 第二个?: 累加器(accumulator)的类型,这里是通配符,表示我们不关心具体的累加器实现
  • 第三个Map<K,U>: 最终收集结果的类型
  • 简单理解:这是一个能将T类型元素收集到Map<K,U>中的收集器。

第1个入参 Function<? super T, ? extends K> keyMapper:

  • Function: 函数式接口,接受一个参数,返回一个结果
    • ? super T: 表示参数类型可以是TT的父类(下界通配符
    • ? extends K: 表示返回类型可以是KK的子类(上界通配符
  • 这个函数的作用:从流中的每个元素T提取或转换出 Map 的键K

第2个入参 Function<? super T, ? extends U> valueMapper:

  • 同理,这个函数的作用:从流中的每个元素T提取或转换出 Map 的值U

第3个入参:BinaryOperator<U> mergeFunction:

  • BinaryOperator<U>: 接受两个相同类型U的参数,返回相同类型U结果的函数式接口
  • 作用:当出现重复键时,如何合并两个值

1.2 使用举例

以学生列表转为 Map举例。

// 学生类 @Data class Student { private String id; private String name; private int age; }

使用3个参数版Collectors.toMap()方法举例:

// 无重复key 使用示例 List<Student> students = Arrays.asList( new Student("001", "Alice", 20), new Student("002", "Bob", 22), new Student("003", "Charlie", 21) ); // 以 ID 为键,Student 对象为值 Map<String, Student> studentMap = students.stream() .collect(Collectors.toMap( Student::getId, // keyMapper: T=Student -> K=String Function.identity(), // valueMapper: T=Student -> U=Student (existing, replacement) -> existing // mergeFunction: 保留已存在的 ));
//---------补充说明--------------------------- // Function.identity() 是 Java 8 函数式编程中的一个重要静态方法,可以理解为 "恒等函数" 或 "原样返回函数"。这个函数接收什么就返回什么,不做任何转换。 // 这三种写法是等价的: Function<String, String> func1 = Function.identity(); Function<String, String> func2 = s -> s; Function<String, String> func3 = (String s) -> s;

当有重复key时,第3个入参“合并策略”就发挥作用了:

// 有重复key 使用示例: 第3个入参“合并策略”就发挥作用了 List<Student> studentsWithDuplicate = Arrays.asList( new Student("001", "Alice", 20), new Student("002", "Bob", 22), new Student("001", "Alice_new", 25) // 重复的 ID ); // 保留新值(后出现的) Map<String, Student> mapKeepNew = studentsWithDuplicate.stream() .collect(Collectors.toMap( Student::getId, Function.identity(), (oldValue, newValue) -> newValue // 保留新值 )); // 保留旧值(先出现的) Map<String, Student> mapKeepOld = studentsWithDuplicate.stream() .collect(Collectors.toMap( Student::getId, s -> s, (oldValue, newValue) -> oldValue // 保留旧值 ));
// 自定义合并逻辑1(比如合并年龄信息) Map<String, Integer> ageSumMap = studentsWithDuplicate.stream() .collect(Collectors.toMap( Student::getId, Student::getAge, // value 是 Integer 类型 Integer::sum // 合并函数:求和 <=> (a1,a2)-> a1+a2 )); // 结果: {"001": 45, "002": 22} // 自定义合并逻辑2 (合并name信息) Map<String, Student> mergeUsers = studentsWithDuplicate.stream() .collect(Collectors.toMap( Student::getId, Function.identity(), (student1, student2) -> { // 比如合并用户信息 return new Student(student1.getId(), student1.getName() + "_" + student1.getName()); } ));

2. 其他版本的Collectors.toMap()

2.1 两参数版本

2.1.1 签名(最基础)

public static <T, K, U> Collector<T, ?, Map<K, U>> toMap( Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper )

说明

  • keyMapper: 将流中的每个元素 T 转换为 Map 的键 K
  • valueMapper: 将流中的每个元素 T 转换为 Map 的值 U
  • 限制:不允许重复的键,否则抛出IllegalStateException

2.1.2 使用举例

无重复key 使用示例:

// 基础对象转Map List<Student> students = Arrays.asList( new Student("001", "Alice", 20), new Student("002", "Bob", 22), new Student("003", "Charlie", 21) ); // 姓名作为key,年龄作为value Map<String, Integer> nameToAge = students.stream() .collect(Collectors.toMap(Student::getName, Person::getAge)); // 结果: {Alice=20, Bob=22, Charlie=21} // 对象本身作为value Map<String, Student> nameToPerson = students.stream() .collect(Collectors.toMap(Student::getName, Function.identity())); // 结果: {Alice=Student{id='001', name='Alice', age=20}, ...}

有重复key 时会抛异常:

List<Student> studentsWithDuplicate = Arrays.asList( new Student("001", "Alice", 20), new Student("002", "Bob", 22), new Student("001", "Alice_new", 25) // 重复的 ID ); // 这行代码会抛出异常! Map<Long, Student> userMap2 = studentsWithDuplicate.stream() .collect(Collectors.toMap(Student::getId, Function.identity())); // 抛出: IllegalStateException: Duplicate key Student{id=001, name='Alice', age=20}

2.2 四参数版本

2.2.1 签名(指定Map实现)

public static <T, K, U, M extends Map<K, U>> Collector<T, ?, M> toMap( Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier )

说明

  • 前三个参数同上
  • mapSupplier: 提供具体的 Map 实现类的构造函数引用

2.2.2 使用举例

List<Person> people = Arrays.asList( new Person("Charlie", 35), new Person("Alice", 25), new Person("Bob", 30) ); // LinkedHashMap - 保持插入顺序 Map<String, Integer> linkedMap = people.stream() .collect(Collectors.toMap( Person::getName, Person::getAge, (v1, v2) -> v1, LinkedHashMap::new )); // 结果: {Charlie=35, Alice=25, Bob=30} (保持原始顺序)
// TreeMap - 按键自然排序 Map<String, Integer> treeMap = people.stream() .collect(Collectors.toMap( Person::getName, Person::getAge, (v1, v2) -> v1, TreeMap::new )); // 结果: {Alice=25, Bob=30, Charlie=35} (按键字母排序)
// ConcurrentHashMap - 线程安全 Map<String, Integer> concurrentMap = people.stream() .collect(Collectors.toMap( Person::getName, Person::getAge, (v1, v2) -> v1, ConcurrentHashMap::new ));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1167409.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qwen Code自定义技能终极指南:快速构建智能工作流

Qwen Code自定义技能终极指南&#xff1a;快速构建智能工作流 【免费下载链接】qwen-code Qwen Code is a coding agent that lives in the digital world. 项目地址: https://gitcode.com/gh_mirrors/qw/qwen-code 你是否曾想过让AI助手真正理解你的工作习惯&#xff1…

3分钟快速上手Mermaid在线编辑器:从零到精通的技术图表制作指南

3分钟快速上手Mermaid在线编辑器&#xff1a;从零到精通的技术图表制作指南 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-li…

bge-large-zh-v1.5避坑指南:sglang部署常见问题全解

bge-large-zh-v1.5避坑指南&#xff1a;sglang部署常见问题全解 1. 部署背景与核心挑战 随着大模型应用的普及&#xff0c;高效、稳定的embedding服务成为语义理解系统的关键基础设施。bge-large-zh-v1.5作为当前表现优异的中文嵌入模型&#xff0c;在检索增强生成&#xff0…

零基础教程:用Cute_Animal_For_Kids_Qwen_Image制作萌宠插画

零基础教程&#xff1a;用Cute_Animal_For_Kids_Qwen_Image制作萌宠插画 1. 引言 1.1 学习目标 本文是一篇面向零基础用户的完整入门指南&#xff0c;旨在帮助你快速掌握如何使用 Cute_Animal_For_Kids_Qwen_Image 这一专为儿童内容设计的AI图像生成镜像&#xff0c;轻松创作…

RevokeMsgPatcher防撤回工具:面向普通用户的完整使用指南

RevokeMsgPatcher防撤回工具&#xff1a;面向普通用户的完整使用指南 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://gitcode…

HY-MT1.5-1.8B实际项目应用:政府文件多语翻译案例

HY-MT1.5-1.8B实际项目应用&#xff1a;政府文件多语翻译案例 1. 引言&#xff1a;轻量级多语翻译模型的现实需求 随着全球化进程加快&#xff0c;政府机构在对外交流、政策发布、公共服务等场景中面临日益增长的多语言翻译需求。传统翻译方案依赖大型云端模型或商业API&…

通义千问2.5-7B-Instruct部署全流程:从镜像拉取到服务启动

通义千问2.5-7B-Instruct部署全流程&#xff1a;从镜像拉取到服务启动 1. 技术背景与部署价值 随着大模型在企业级应用和本地化推理场景中的普及&#xff0c;对高性能、低资源占用且支持商用的中等体量模型需求日益增长。通义千问2.5-7B-Instruct 正是在这一背景下推出的代表性…

GLM-ASR-Nano-2512语音搜索:音频大数据分析

GLM-ASR-Nano-2512语音搜索&#xff1a;音频大数据分析 1. 技术背景与核心价值 随着智能语音交互和音频内容爆炸式增长&#xff0c;自动语音识别&#xff08;ASR&#xff09;技术已成为连接人类语言与数字世界的桥梁。在媒体内容检索、会议记录自动化、客服系统智能化等场景中…

ARM平台在工业控制中的应用:入门必看指南

ARM平台在工业控制中的实战解析&#xff1a;从选型到部署的深度指南你有没有遇到过这样的场景&#xff1f;一台老旧的PLC设备&#xff0c;只能跑Modbus RTU&#xff0c;连个网页配置界面都没有&#xff1b;想加个远程监控功能&#xff0c;结果发现CPU资源早就被基础逻辑占满&am…

Open-LLM-VTuber聊天记录管理完整教程:从零开始掌握AI虚拟主播对话历史保存与切换

Open-LLM-VTuber聊天记录管理完整教程&#xff1a;从零开始掌握AI虚拟主播对话历史保存与切换 【免费下载链接】Open-LLM-VTuber Talk to LLM by voice with Live2D that runs offline on multiple platforms. An attempt to build AI VTuber neuro-sama. 项目地址: https://…

解决TensorFlow兼容难题|DCT-Net GPU镜像支持RTX 4090全图转换

解决TensorFlow兼容难题&#xff5c;DCT-Net GPU镜像支持RTX 4090全图转换 随着AI生成内容&#xff08;AIGC&#xff09;在图像风格迁移领域的快速发展&#xff0c;人像卡通化技术逐渐成为虚拟形象构建、社交娱乐和数字内容创作的重要工具。其中&#xff0c;基于深度学习的 DC…

Qwen1.5-0.5B压力测试:高并发场景下的稳定性表现

Qwen1.5-0.5B压力测试&#xff1a;高并发场景下的稳定性表现 1. 引言 1.1 项目背景与技术挑战 随着大语言模型&#xff08;LLM&#xff09;在实际业务中的广泛应用&#xff0c;如何在资源受限的边缘设备或CPU环境中实现高效、稳定的AI服务部署&#xff0c;成为工程落地的关键…

Czkawka Windows GUI版:从下载到精通的文件整理利器

Czkawka Windows GUI版&#xff1a;从下载到精通的文件整理利器 【免费下载链接】czkawka 一款跨平台的重复文件查找工具&#xff0c;可用于清理硬盘中的重复文件、相似图片、零字节文件等。它以高效、易用为特点&#xff0c;帮助用户释放存储空间。 项目地址: https://gitco…

eide自动构建脚本编写:操作指南

用脚本掌控嵌入式构建&#xff1a;eide自动化实战指南你有没有经历过这样的场景&#xff1f;新同事刚入职&#xff0c;折腾一整天环境都没跑通“Hello World”&#xff1b;产品要发布固件&#xff0c;结果发现忘了签名&#xff1b;换了个MCU型号&#xff0c;又要重写一遍Makefi…

Flutter/iOS开发工程师职位深度解析与面试指南

南京蔚蓝智能科技有限公司 Flutter/iOS 开发工程师 职位信息 职责描述: 1. 负责四足机器人相关移动应用的需求分析、架构设计及核心功能模块的研发工作; 2. 主导或参与机器人内部创新功能模块的移动端软件设计与实现; 3. 优化应用性能与用户体验,解决卡顿、闪退等问题,适配…

QQ 9.9.6防撤回终极修复指南:一键恢复完整功能

QQ 9.9.6防撤回终极修复指南&#xff1a;一键恢复完整功能 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://gitcode.com/GitHu…

Qwen3-4B-Instruct-2507自动批改系统

Qwen3-4B-Instruct-2507自动批改系统 1. 简介 Qwen3-4B-Instruct-2507 是阿里开源的一款高效能文本生成大模型&#xff0c;专为指令理解与复杂任务执行优化。该模型在多个维度实现了显著的技术突破&#xff0c;尤其适用于教育、内容审核、自动化办公等需要高精度语义理解与生…

OBS Studio屏幕标注插件开发实战指南

OBS Studio屏幕标注插件开发实战指南 【免费下载链接】obs-studio OBS Studio - 用于直播和屏幕录制的免费开源软件。 项目地址: https://gitcode.com/GitHub_Trending/ob/obs-studio 重新定义直播互动体验 在当今数字化时代&#xff0c;实时屏幕标注已成为直播教学、在…

OpenArk实战指南:Windows系统威胁检测与防护利器

OpenArk实战指南&#xff1a;Windows系统威胁检测与防护利器 【免费下载链接】OpenArk The Next Generation of Anti-Rookit(ARK) tool for Windows. 项目地址: https://gitcode.com/GitHub_Trending/op/OpenArk 你是否曾遇到系统运行缓慢却找不到原因&#xff1f;或者怀…

通义千问2.5-7B-Instruct与Baichuan2-7B对比:中文理解能力评测

通义千问2.5-7B-Instruct与Baichuan2-7B对比&#xff1a;中文理解能力评测 1. 技术背景与评测目标 随着大语言模型在中文场景下的广泛应用&#xff0c;70亿参数量级的中等规模模型因其在性能、成本和部署灵活性之间的良好平衡&#xff0c;成为企业级应用和开发者部署的热门选…