使用stream()转map去重主键冲突
stream()流可以很方便的我们去做很多操作,比如过滤,转换list,分组等等,这里要讲的是stream的去重.
public class Test { public static void main(String[] args) { List<User> userList = new ArrayList<>(); User u1 = new User(); u1.setUserId("11111"); u1.setUserName("小明"); u1.setBirthDay(new Date()); User u2 = new User(); u2.setUserId("11111"); u2.setUserName("小红"); u2.setBirthDay(new Date()); User u3 = new User(); u3.setUserId("33333"); u3.setUserName("小蓝"); u3.setBirthDay(new Date()); User u4 = new User(); u4.setUserId("44444"); u4.setUserName("小黄"); u4.setBirthDay(new Date()); userList.add(u1); userList.add(u2); userList.add(u3); userList.add(u4); Map<String, User> userMap = userList.stream().collect(Collectors.toMap(User::getUserId, Function.identity())); System.out.println(JSONUtils.toJSONString(userMap)); } } ------------------------------------------------ Exception in thread "main" java.lang.IllegalStateException: Duplicate key User(userId=11111, userName=小明, birthDay=Mon Nov 28 14:56:05 CST 2022) at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133) at java.util.HashMap.merge(HashMap.java:1255) 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:1384) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472) 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 com.tl.ie.controller.Test.main(Test.java:41)
直接使用map去重时,如果主键重复,就会有 Duplicate key 异常,所以这里当我们主键重复时,需要选择来去重
Map<String, User> userMap = userList.stream().collect(Collectors.toMap(User::getUserId, Function.identity(),(oldData,newData)->newData)); System.out.println(new ArrayList<>(userMap.values())); ---------------------------------------------------------------------- [User(userId=44444, userName=小黄, birthDay=Mon Nov 28 15:02:23 CST 2022), User(userId=33333, userName=小蓝, birthDay=Mon Nov 28 15:02:23 CST 2022), User(userId=11111, userName=小红, birthDay=Mon Nov 28 15:02:23 CST 2022)]
选择的方法就是 (oldData,newData)->newData ,如果选择oldData就是选择先加入的对象,如果选择newData,就是选择后面的对象覆盖前面的对象,可以看到这里我选择了newData,所以保留的是小红,去掉了小明
下一篇:
数据库三大范式的理解