在 Java 库源代码中,该Collectors#toList
方法是这样定义的:
public static <T>
Collector<T, ?, List<T>> toList() {
return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,
(left, right) -> { left.addAll(right); return left; },
CH_ID);
}
我们将BinaryOperator
其视为构造函数的第三个参数CollectorImpl
,它在线性时间内合并了两个子结果。
是不是说,如果通过Stream#collect
方法频繁使用这个函数,我们可以获得平方计算时间?
考虑这段代码:
List<Integer> desc = Stream.iterate(n, k -> k - 1).limit(n + 1)
.collect(Collectors.toList());
desc.parallelStream()
.map(k -> {
try {
Thread.sleep(k * 500);
} catch (InterruptedException ignored) {
}
return k;
})
.collect(Collectors.toList());
第二个流的元素恰好按降序计算。collect 方法可以做的最简单的事情是将每个数字包装成List
并将所有下一个数字添加到其中,总复杂度为平方,多么可悲。