List转Map报错“Duplicate key”

文章展示了在使用JavaStream进行集合转换时,如何处理可能出现的键冲突问题。通过Collectors的toMap方法,分别给出了两种解决方案:一是当键重复时保留第一个值(k->v1对1),二是将多个值合并为一个字符串(k->v允许1对多)。示例代码中通过User对象的id作为键,name作为值,演示了这两种解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

示例list:

List<User> userList = new ArrayList<>();
userList.add(new User(1, "小花"));
userList.add(new User(1, "小草"));

原来代码 报错版本:

Map<Integer, String> map = userList.stream().collect(
Collectors.toMap(User::getId, User::getName))

直接看答案 正确版本1: k->v 1对1

增加 (k, v) -> k)
结果:{“1”:“小花”}

 Map<Integer, String> map2 = userList.stream().collect(
 Collectors.toMap(User::getId, User::getName, (k, v) -> k));

直接看答案 正确版本2: k->v 允许1对多

增加 (k, v) -> k + "," + v
结果:{“1”:“小花,小草”}

 Map<Integer, String> map3 = userList.stream().collect(
 Collectors.toMap(User::getId, User::getName, (k, v) -> k + "," + v));

————————————————————————————————
————————————————————————————————

慢慢查看源代码 分析原因

在这里插入图片描述
在这里插入图片描述
原来代码 报错版本:
可以看到我们参数仅仅是: key ,value

Map<Integer, String> map = userList.stream().collect(
Collectors.toMap(User::getId, User::getName))

调用源码方法:
在这里插入图片描述
找到了报错位置:
在这里插入图片描述

源码提供解决方法:
在这里插入图片描述

示例代码 copy本地运行

import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Test {

    public static void main(String[] args) {
        List<User> userList = new ArrayList<>();
        userList.add(new User(1, "小花"));
        userList.add(new User(1, "小草"));


//        Map<Integer, String> map = userList.stream().collect(Collectors.toMap(User::getId, User::getName));
        Map<Integer, String> map2 = userList.stream().collect(Collectors.toMap(User::getId, User::getName, (k, v) -> k));
        Map<Integer, String> map3 = userList.stream().collect(Collectors.toMap(User::getId, User::getName, (k, v) -> k + "," + v));


//        System.out.println(JSON.toJSON(map));
        System.out.println(JSON.toJSON(map2));
        System.out.println(JSON.toJSON(map3));

    }


}

@Data
@NoArgsConstructor
@AllArgsConstructor
class User {
    Integer id;

    String name;

}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值