Java lambda 实现条件过滤,去重方法2

前言

 

在之前的文章中,我们已经介绍过一个利用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) 这个构造函数。

如此以来就完成了我们想要的条件去重。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Scroll to Top