【问题总结】用Stream流将List转为Map的时候,出现Duplicate key错误,怎么办?

1. 场景还原

1. 伪代码

public static void main(String[] args) {

        ArrayList<User2> list = new ArrayList<>();
        list.add(new User2(1, "2"));
        list.add(new User2(1, "3"));
        list.add(new User2(1, "4"));

        Map<Integer, User2> collect = list.stream()
        		.collect(Collectors.toMap(e -> e.getId(), e -> e));
}

@Data
public class User2 {
    private int id;
    private String name;

    public User2() {
    }
    public User2(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

2. 控制台现象

Connected to the target VM, address: '127.0.0.1:59601', transport: 'socket'
Exception in thread "main" java.lang.IllegalStateException: Duplicate key User2(id=1, name=2)
	at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
	at java.util.HashMap.merge(HashMap.java:1254)
	at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
	at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
	at model.ProducerConsumerTest.main(ProducerConsumerTest.java:20)
Disconnected from the target VM, address: '127.0.0.1:59601', transport: 'socket'

糟糕报错了。。。Duplicate key表示的是重复Key,无法区分。。

2. 错误做法

Map<Integer, User2> collect = list.stream()
                .collect(Collectors.toMap(e -> e.getId(), e -> e));

本方法是采用Collectors中的toMap方法,只有两个入参

  1. key是什么?
  2. value是什么?
    在这里插入图片描述

3. 正确做法

Map<Integer, User2> collect = list.stream()
				// 当出现重复key时,默认取老的
                .collect(Collectors.toMap(e -> e.getId(), e -> e, (k1, k2) -> k1));

本方法在上面那个方法的基础上,多了一个mergeFunction入参,就是代表如果key对应的字段发送重复的时候的选取规则(选老的还是选新的)
在这里插入图片描述

问题解决,完结撒花~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值