在 Java 8 中,如何通过检查每个对象的属性的独特性来使用 Stream
API 过滤集合?
例如,我有一个 Person
对象的列表,我想删除同名的人,
persons.stream().distinct();
将对 Person
对象使用默认相等检查,所以我需要类似的东西,
persons.stream().distinct(p -> p.getName());
不幸的是 distinct()
方法没有这样的重载。如果不修改 Person
类中的相等检查,是否可以简洁地做到这一点?
原文由 RichK 发布,翻译遵循 CC BY-SA 4.0 许可协议
考虑
distinct
是一个 _有状态的过滤器_。这是一个返回谓词的函数,该谓词维护先前看到的状态,并返回是否第一次看到给定元素:然后你可以写:
请注意,如果流是有序的并且并行运行,这将保留重复项中的 任意 元素,而不是第一个元素,就像
distinct()
那样。(这与 我对这个问题的回答 基本相同: Java Lambda Stream Distinct() on absolute key? )