Java 中Duplicate key 异常

当在Java中使用List转换为Map时遇到Duplicate key异常,原因是转换list中的key属性重复。解决方法是采用能处理重复key的转换策略,如在冲突时保留先出现的元素。

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

1.问题

Java中Duplicate key 异常解决
使用Java8中提供的list 转换map方法时,会出现下面的问题:

java.lang.IllegalStateException: Duplicate key

产生这个问题的原因时我们参与转换的list中,作为key的属性有重复,没有办法确定使用哪个元素来作为转换后map中的value,下面的例子可以复现这个场景:

 @Test
 public void duplicateKey(){
        List<String> list = new LinkedList<>();
        list.add("apple");
        list.add("banana");
        list.add("banana");
        list.add("pear");
        Map<String, String> map = list.stream().collect(Collectors.toMap(item -> item, item -> item));
        for (Map.Entry<String, String> entry : map.entrySet()) {
            System.out.println(entry.toString());
        }
    }

 上面代码运行时,会产生这样的异常:

java.lang.IllegalStateException: Duplicate key banana 

这个异常就是说,转换map的过程中,有两个key是banana的元素,不知道怎么取舍,因此产生异常。 

2.解决

解决办法就是我们去提供这样一个策略。
查看他的源码:

public static <T, K, U>
    Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                    Function<? super T, ? extends U> valueMapper) {
        return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
    }
 
    public static <T, K, U>
    Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                    Function<? super T, ? extends U> valueMapper,
                                    BinaryOperator<U> mergeFunction) {
        return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new);
    }

 有这样两个方法,出错的地方我们是用的第一个方法,对于可能存在重复key的转换中,我们要使用第二个方法。

 Map<String, String> map = list.stream().
         collect(Collectors.toMap(item -> item, item -> item, (item1, item2) -> item1));


我这里使用的是两个key 相同时,保留先存进去的那个元素。相比第一个方法,主要就是我们要去实现一个策略,来决定key相同时,元素如何保留。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值