Java8 中 List 转 Map(Collectors.toMap) 使用技巧

本文详细介绍了如何使用toMap函数创建Map对象,包括指定key和value的生成方式以及处理key冲突的方法。

使用toMap()函数之后,返回的就是一个Map了,自然会需要key和value。
toMap()的第一个参数就是用来生成key值的,第二个参数就是用来生成value值的。
第三个参数用在key值冲突的情况下:如果新元素产生的key在Map中已经出现过了,第三个参数就会定义解决的办法。

在你的例子中
 .collect(Collectors.toMap(UserBo::getUserId, x -> x, (x, y) -> x));
第一个参数UserBo::getUserId 表示选择UserBo的getUserId作为map的key值;
第二个参数x -> x表示选择将原来的对象作为map的value值;
第三个参数(x, y) -> x中,如果x与y的key值相同,选择x作为那个key所对应的value值

https://zhangzw.com/posts/20191205.html

https://blog.youkuaiyun.com/qq_38826019/article/details/109401567

### 使用 `Collectors.toMap()` 实现去重 在 Java 中,`Stream` 接口提供了强大的功能来操作集合数据。其中,`Collectors.toMap()` 是一种常用的方法,用于将 `List` 换为 `Map`。然而,在实际应用中可能会遇到键重复的问题。为了避免这种情况下的异常(如 `IllegalStateException`),可以通过指定一个合并函数来解决。 以下是完整的解决方案: #### 处理键冲突的代码示例 ```java import java.util.*; import java.util.stream.Collectors; class User { private String id; private String name; public User setId(String id) { this.id = id; return this; } public User setName(String name) { this.name = name; return this; } public String getId() { return id; } public String getName() { return name; } } public class Main { public static void main(String[] args) { List<User> list = Arrays.asList( new User().setId("1").setName("张小"), new User().setId("2").setName("李大"), new User().setId("2").setName("小明") ); // 使用 Collectors.toMap 并提供合并逻辑 Map<String, String> map = list.stream() .collect(Collectors.toMap( User::getId, // Key 映射函数 User::getName, // Value 映射函数 (existingValue, newValue) -> existingValue // 合并逻辑:保留旧值 )); System.out.println(map); } } ``` 在这个例子中,当键发生冲突时,`(existingValue, newValue) -> existingValue` 定义了一个简单的合并策略——保留第一个出现的值[^3]。 #### 输出结果解释 假设输入列表如下: ```plaintext [ {"id": "1", "name": "张小"}, {"id": "2", "name": "李大"}, {"id": "2", "name": "小明"} ] ``` 执行上述代码后的输出将是: ```plaintext {1=张小, 2=李大} ``` 这里,“2”对应的名称发生了冲突,因此选择了第一次出现的 “李大”。 --- ### 更复杂的合并逻辑 如果希望自定义更复杂的合并规则,可以修改 `(existingValue, newValue)` 函数的内容。例如,可以选择最新的值或者组合两个值。 #### 示例:选择最新值 ```java .collect(Collectors.toMap( User::getId, User::getName, (existingValue, newValue) -> newValue // 合并逻辑:保留新值 )); ``` 在这种情况下,最终的结果将会是: ```plaintext {1=张小, 2=小明} ``` #### 示例:拼接字符串 ```java .collect(Collectors.toMap( User::getId, User::getName, (existingValue, newValue) -> existingValue + "," + newValue // 合并逻辑:拼接字符串 )); ``` 此时,对于重复的键,其值会被连接起来,形成一个新的字符串。例如: ```plaintext {1=张小, 2=李大,小明} ``` --- ### 总结 通过向 `Collectors.toMap()` 提供三个参数(键映射器、值映射器以及合并函数),可以在键冲突的情况下灵活地控制行为。这不仅能够避免程序崩溃,还能满足不同的业务需求[^5]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值