【发布时间】:2015-05-26 10:31:45
【问题描述】:
示例程序:
public final class CollectorTest
{
private CollectorTest()
{
}
private static <T> BinaryOperator<T> nope()
{
return (t, u) -> { throw new UnsupportedOperationException("nope"); };
}
public static void main(final String... args)
{
final Collector<Integer, ?, List<Integer>> c
= Collector.of(ArrayList::new, List::add, nope());
IntStream.range(0, 10_000_000).boxed().collect(c);
}
}
所以,为了简单起见,这里没有最终的转换,所以生成的代码很简单。
现在,IntStream.range() 生成一个顺序流。我只需将结果放入Integers 中,然后我设计的Collector 将它们收集到List<Integer> 中。很简单。
无论我运行这个示例程序多少次,UnsupportedOperationException 都不会命中,这意味着我的虚拟组合器永远不会被调用。
我有点预料到这一点,但我已经误解了流,以至于我不得不问这个问题......
当流保证是连续的时,是否可以调用Collector 的组合器?
【问题讨论】:
-
我敢打赌,即使没有必要,也无法保证这一点。
-
@MarkoTopolnik 或者我(再次)误读了 javadoc,它实际上是明确的,一种或另一种方式......
-
"combiner 然而总是抛出" > 我不明白你这句话的这一部分 - 总是抛出什么?
-
文档中最相关的部分似乎是“使用收集器的缩减的顺序实现将使用供应商函数创建单个结果容器,并调用累加器函数一次每个输入元素。并行实现将对输入进行分区,为每个分区创建一个结果容器,将每个分区的内容累积到该分区的子结果中,然后使用组合器函数将子结果合并为组合结果。 i>”,这是相当宽松的措辞。
-
Here,Stuart Marks 描述了 combiner 在
reduce案例中的作用,他没有提到顺序合并操作的任何可能性。
标签: java java-8 java-stream