stream将list转map时,key重复导致报错的问题解决方案


要将List对象集合转为map集合,可以通过stream流的形式快速实现转换:

异常:

 

 

 意思为map中出现了重复的key,也就是说通过上述方法转map时,出现重复key并不会出现覆盖的情况,而是再次在map中添加一个重复的key,导致报错。

所以通过stream实现list转map时,要实现重复的key会被覆盖,可以使用Function.identity()方法:

//三个Users对象组成一个List集合
List<Users> list = new ArrayList<>();
list.add(Users.builder().userName("11").userId(1).build());
list.add(Users.builder().userName("11").userId(2).build());
list.add(Users.builder().userName("33").userId(3).build());
//将list转map,这里是出现重复key时,覆盖前一个
Map<String, Users> usersMap = list.stream()
    .collect(Collectors.toMap(Users::getUserName, Function.identity(), (user1, user2) -> user2));
System.out.println(usersMap.get("11"));
//输出结果:
edu.nf.ch08.entity.Users@41aaedaa

增加重复key情况下的冲突处理策略:

Map<String, Integer> dataMap = employees.stream().collect(Collectors.toMap(e -> e.getFirstName(), e -> e.getAge(), (k1, k2)-> k1));
       Assert.assertThat(dataMap, hasKey("zhang"));
       Assert.assertThat(dataMap, hasKey("Li"));
       Assert.assertThat(dataMap, hasKey("Chen"));
       Assert.assertThat(dataMap.keySet(), hasSize(3));
       Map<Integer, Employee> employeeMap = employees.stream().collect(Collectors.toMap(e->e.getAge(), e->e, (k1, k2) -> k1));
       Assert.assertThat(dataMap.keySet(), hasSize(3));

这里的处理策略是:

(k1, k2) -> k1

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM