【发布时间】:2017-05-05 13:37:26
【问题描述】:
假设我有一个 Stream<T> 并且只想获取不同的元素并进行排序。
天真的方法是只做以下事情:
Stream.of(...)
.sorted()
.distinct()
或者,也许反过来:
Stream.of(...)
.distinct()
.sorted()
由于 JDK 的源代码无法真正访问它们的实现,我只是想知道可能的内存消耗和性能影响。
或者像下面这样编写我自己的过滤器会更有效吗?
Stream.of(...)
.sorted()
.filter(noAdjacentDuplicatesFilter())
public static Predicate<Object> noAdjacentDuplicatesFilter() {
final Object[] previousValue = {new Object()};
return value -> {
final boolean takeValue = !Objects.equals(previousValue[0], value);
previousValue[0] = value;
return takeValue;
};
}
【问题讨论】:
-
在最好的情况下,底层实现会识别,如果
distinct()和sort()相互跟随并将它们融合到一个操作中。请记住,Streams 是惰性的,在您链接终端操作之前它不会做任何事情,此时,它知道您链接了什么。 -
@Holger 我明白;如果这种情况真的发生并且这种行为是否得到保证,我会很感兴趣。
-
好吧,我想这也取决于数据的性质:很少有不同的值多次出现,或者很多不同的值有一些重复......在第二种情况下 sorted() 然后distinct() 更好;在第一种情况下,可能是 distinct() 然后 sort() 可能更快,尤其是对于分散的数据。我的两分钱。
标签: java performance java-8 java-stream