如何在搜索重复项时删除流中的第一个外观?

Pab*_*mez 2 java java-8 java-stream

我有一个对象流,它根据它们拥有的id定义equals和hashcode.所以我知道使用stream.distinct()我会得到一个没有任何重复的流,但它会保留第一个外观,而不是最后一个.

这在文档中明确说明:

对于有序流,不同元素的选择是稳定的*(对于重复元素,将保留遇到*顺序中首先出现的元素.)

那么我怎么能有一个没有重复的流,但保持最后的外观呢?

例如,如果我有这个项目列表1,2,3,1,4,5.

如果我申请,distinct()我会得到1,2,3,4,5,我期待:2,3,1,4,5.我怎样才能做到这一点?

Ole*_*hin 8

toMap具有访问顺序的自定义收集器LinkedHashMap是一个良好的开端,例如:

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 );
Run Code Online (Sandbox Code Playgroud)

保留项目的最后一个外观的任务意味着在生成新流的第一个元素之前,您必须完全使用原始流,因此收集和创建新流并不是那么糟糕.如评论中所建议的那样,反转,应用不同和反转将完全消耗原始和"不同"流,因此使用专门的收集器应该更好.