我有一个对象流,它根据它们拥有的 id 定义 equals 和 hashcode。所以我知道使用 stream.distinct()
我将得到一个没有任何重复项的流,但它将保留第一个外观,而不是最后一个外观。
文档中明确说明了这一点:
For ordered streams, the selection of distinct elements is stable * (for duplicated elements, the element appearing first in the encounter * order is preserved.)
那么我怎样才能拥有一个没有重复项但保留最后一次出现的流呢?
例如,如果我有这个项目列表1,2,3,1,4,5
。
如果我应用distinct()
,我将得到1,2,3,4,5
,我期望:2,3,1 ,4,5
。我怎样才能实现这个目标?
最佳答案
具有访问顺序LinkedHashMap
的自定义toMap
收集器是一个好的开始,例如:
Stream.of( 1, 2, 3, 1, 4, 5 )
.collect( Collectors.toMap(
key -> key,
value -> value,
( oldValue, newValue ) -> newValue,
() -> new LinkedHashMap<>( 16, 0.75f, true )
) )
.values()
.stream()
.forEach( System.out::println );
保留项目的最后外观的任务意味着您必须在生成新流的第一个元素之前完全消耗原始流,因此收集和创建新流并不是那么糟糕。正如评论中所建议的,反转、应用不同的,然后再次反转,将完全消耗原始流和“不同”流,因此使用专门的收集器应该更好。
关于java - 搜索重复项时如何删除流中的首次出现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44911819/