当前位置: 首页 > 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.dtcms.com/a/273456.html

相关文章:

  • 用 React Three Fiber 实现 3D 城市模型的扩散光圈特效
  • Android 开发中插桩
  • RK3566/RK3568 Android11 修改selinux模式
  • JAVA后端开发——类命名规范
  • android 的软件盘
  • 五镜头倾斜摄影相机的技术优势与应用原理
  • 影石(insta360)GO3拇指相机格式化后的恢复方法
  • 远程登录docker执行shell报错input is not a terminal问题
  • 宝塔命令Composer 更改数据源不生效
  • php中调用对象的方法可以使用array($object, ‘methodName‘)?
  • BP神经网络对时序数据进行分类
  • SpringBoot项目保证接口幂等的五种方法!
  • Typecho性能优化全攻略:从数据库到PHP的深度调优
  • 线性回归原理推导与应用(十):逻辑回归多分类实战
  • 文章发布易优CMS(Eyoucms)网站技巧
  • 1Panel V1 无缝升级到 V2 版本 实现多个 PHP 网站共享一个容器
  • 搭建渗透测试环境
  • 【工具变量】全国省市区县土地出让结果公告数据(2000-2024年)
  • 【操作系统】线程
  • RabbitMQ 之消息积压
  • 从 Python 演进探寻 AI 与云对编程语言的推动
  • 【C/C++ shared_ptr 和 unique_ptr可以互换吗?】
  • 传输层协议UDP原理
  • 秋招小白学数据结构-1-数据结构前置知识
  • C Primer Plus 第6版 编程练习——第9章(上)
  • Umi-OCR 的 Docker(win制作镜像,Linux(Ubuntu Server 22.04)离线部署)
  • 微软语音合成标记语言SSML文档结构和事件(详细文档和实例)
  • 企业级配置:Azure 邮件与 Cloudflare 域名解析的安全验证落地详解
  • Unity Demo——3D平台跳跃游戏笔记
  • 一个与运行 Qwen3 大语言模型的 vLLM 服务进行通信的客户端程序