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(...), 下面是简单代码:

执行后打印出

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

成功去重,换个名照样能认出来,还不依赖于 equals/hashCode 方法。

链接: Remove duplicates from a list of objects based on property in Java 8

类别: Java8. 标签: . 阅读(1,442). 订阅评论. TrackBack.

4
Leave a Reply

avatar
2 Comment threads
2 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
3 Comment authors
RussYanbin晕红著雨 Recent comment authors
Russ
Guest
Russ

简单一点呀,在外面 new 一个Set<Integer> ids
books.stream().filter(book -> ids.add(book.getId())).collect(Collectors.toList);
如果还想过滤 name,再 new 一个 Set,然后 filter() 一次
不过这样会有 垃圾变量

晕红著雨
Guest
晕红著雨

给我解决了mockito修改私有属性的问题,就是想评论一下这个神奇的博客,博主是男生还是女生呀