Java 8 根据属性值对列表去重

对列表的去重处理,Java 8 在 Stream 接口上提供了类似于 SQL 语句那样的 distinct() 方法,不过它也只能基于对象整体比较来去重,即通过 equals/hashCode 方法。distinct 方法的功效与以往的 new ArrayList(new HashSet(books)) 差不多。用起来是

List<Book> unique = book.stream().distinct().collect(Collectors.toList())

并且这种去重方式需要在模型类中同时实现 equals 和 hashCode 方法。

回到实际项目中来,我们很多时候的需求是要根据对象的某个属性来去重。比如接下来的一个实例,一个 books 列表中存在 ID 一样,name 却不同的 book, 我们认为这是重复的,所以需要根据 book 的 id 属性对行去重。在 collect 的时候用到的方法是 collectinAndThen(…), 下面是简单代码:

/**
 * @author wzx
 * @time 2018/2/9
 */
public class Deduplication {
    public static void main(String[] args) {
        List<Book> books = Arrays.asList(
                new Book(12, "Sun Java"),
                new Book(12, "Oracle Java"),
                new Book(15, "Scala")
        );
        List<Book> unique = books.stream().collect(
                Collectors.collectingAndThen(Collectors.toCollection(
                        () -> new TreeSet<>(Comparator.comparing(o -> o.id))), ArrayList::new)
        );
        unique.forEach(book -> System.out.printf("book[id: %s, name: %s]\n", book.id, book.name));
    }
}

class Book {
    public final Integer id;
    public final String name;

    public Book(Integer id, String name) {
        this.id = id;
        this.name = name;
    }
}

执行后打印出

book[id: 12, name: Sun Java]
book[id: 15, name: Scala]

https://unmi.cc/java-8-list-deduplication-with-lambda/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值