java - 搜索重复项时如何删除流中的首次出现?

标签 java java-8 java-stream

我有一个对象流,它根据它们拥有的 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/

相关文章:

java - 是否可以在不关闭流的情况下对元素进行分组?

java - 使用 Java 或 Python 将 8 位(16 色调色板)PNG 转换为适当的 4 位(16 色调色板)?

java - 拍摄照片并在 Android 的 ImageView 中以全尺寸显示

java - 使用流 StreamSupplier

java - 我们需要 BiFunction 接口(interface)做什么?

java - 使用 Java Stream 计算项目列表中日期的出现次数

java - 如何使用 Java 8/stream API 列出、映射和 "print if count>0"?

java - 检测链表中的循环 - 指针何时相遇?如何通过交集找到循环的头部?

java.io.FileNotFoundException :/tomcat/lib/webservices-api. jar

java - 在 Java 8 中将字符串转换为 Map<Integer,String>