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

Java 中使用 Stream 将 List 转换为 Map 实战笔记(生产级版)

Java 中使用 Stream 将 List 转换为 Map 实战笔记(生产级版)

在日常开发中,将 List 转换为 Map 是高频操作(如通过 ID 快速查询对象、按属性分组等)。使用 Stream API 的 Collectors.toMap() 可以优雅实现,但生产环境中需关注键冲突、null 键、Map 实现选择等细节。本文系统梳理核心用法、易错点及最佳实践,帮你写出健壮且高效的代码。

一、基础准备:前提与场景

1. 示例对象定义

下文示例基于 User 类,含常见属性及 getter 方法(生产中建议用 Lombok 简化,@Data 注解会自动生成 getter、equals、hashCode 等方法,减少模板代码):

@Data // Lombok 注解:自动生成 getter/setter/equals/hashCode/toString
public class User {private Integer id;    // 包装类型,可能为 null(需特别处理)private String name;   // 可能为 nullprivate int age;       // 基本类型,无 null 问题public User(Integer id, String name, int age) {this.id = id;this.name = name;this.age = age;}
}

2. 核心方法:Collectors.toMap() 签名解析

toMap() 有两个重载方法,需根据场景选择:

// 基础版:仅指定键、值映射(默认用 HashMap,键冲突会抛异常)
toMap(Function<? super T, ? extends K> keyMapper,  // 键映射逻辑Function<? super T, ? extends U> valueMapper // 值映射逻辑
)// 完整版:支持键冲突处理 + 指定 Map 实现(生产级场景首选)
toMap(Function<? super T, ? extends K> keyMapper,    // 键映射逻辑Function<? super T, ? extends U> valueMapper,  // 值映射逻辑BinaryOperator<U> mergeFunction,               // 键冲突处理策略Supplier<M> mapFactory                         // 指定 Map 实现(如 TreeMap)
)

核心区别:基础版仅适用于「键绝对唯一且无需定制 Map 类型」的场景,生产中更推荐完整版,避免隐藏风险。

二、基础转换:方法引用 vs Lambda 表达式

1. 简单属性映射(最常用场景)

根据映射逻辑的复杂度,可选择更简洁的方法引用或更灵活的 Lambda:

方法引用
  • 适用场景: 映射逻辑简单(直接取属性),代码更简洁

  • Map<Integer, String> userMapByMethodRef = users.stream().collect(Collectors.toMap(User::getId, 
http://www.lryc.cn/news/585615.html

相关文章:

  • 【Freertos实战】零基础制作基于stm32的物联网温湿度检测(教程非常简易)持续更新中.........
  • 计算机网络第三章(5)——数据链路层《广域网》
  • 【网络编程】KCP——可靠的 UDP 传输协议——的知识汇总
  • 触控屏gt1947
  • 数据治理到底是什么?搞清这四件事,你就彻底明白了!
  • 【C++】内联函数inline以及 C++入门(4)
  • 静态路由综合配置实验报告
  • python实现DoIP基本通信(收发报文)
  • 深入探索Kafka Streams:企业级实时数据处理实践指南
  • 外媒:蚂蚁数科等科技公司在香港数字资产枢纽建设中显身手
  • 基于强化学习的智能推荐系统优化实践
  • 星云穿越与超光速飞行特效的前端实现原理与实践
  • 运筹说 第140期 | 从直觉到算法:这些奠基人如何塑造了启发式方法的科学根基?
  • 分享|2025年机器学习工程师职业技术证书报考指南
  • ABP VNext + Microsoft YARP:自定义反向代理与请求路由
  • 七牛云运维面试题及参考答案
  • RabbitMQ 之顺序性保障
  • 单链表,咕咕咕
  • 鸿蒙系统安全机制全解:安全启动 + 沙箱 + 动态权限实战落地指南
  • C语言易错点(二)
  • SEQUENCE在RAC多实例开启CACHE的NEXTVAL数值乱序问题
  • 打破内网壁垒,轻松实现安防视频的云端汇聚与P2P超低延迟播放
  • 【unity编辑器开发与拓展EditorGUILayoyt和GUILayoyt】
  • 数据蓝海里的合规漩涡
  • Windows GNU Radio避坑
  • CUDA程序中的Benchmark耗时测量方法与工具推荐
  • 深度学习笔记30-阿尔茨海默病诊断特征优化版(Pytorch)
  • 和鲸社区深度学习基础训练营2025年关卡4
  • 面试官:你再问TCP三次握手,我就要报警了!
  • uniapp-在windows上IOS真机运行(含开发证书申请流程)