前言
在之前的文章中,我们已经介绍过一个利用java lambda 实现条件去重的方法了。
利用之前的方法,可以实现下面的功能。
List<User> distinctUsers = users.stream() .distinct(User::getName) .collect(Collectors.toList());
参见:
Java8- Lambda如何实现条件去重distinct List,如何实现条件分组groupBy List
方法二
今天我们将介绍第二种方法,利用 java 的 collectors 和 treeset 实现去重。
我们知道 TreeSet 是可以根据传入的比较方法,自动去重的,我们就从这里入手。
我们有一个 List<User> 类似这样的对象, 要对 User 的 name 进行条件去重。
List<User> users = new ArrayList<>(); TreeSet<User> useSet = users.stream() .collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getUsername))));
上面的代码已经根据 username 去过重了,并且转换成了 TreeSet,但我们要的是一个 list, 再通过 TreeSet 转换成 list 似乎有些麻烦,好在 Collectors 工具类提供给我们一个处理方法了。
List<User> users = new ArrayList<>(); ArrayList<User> userList = users.stream() .collect( Collectors.collectingAndThen( Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getUsername))), ArrayList::new) );
其中 Collectors.collectingAndThen 第一个参数就是需要去重的逻辑,第二个参数就是最后返回的结果处理方法,其实是调用了 new ArrayList<>(treeSet) 这个构造函数。
如此以来就完成了我们想要的条件去重。