组合器不会减少0和1的列表。当流不是并行运行时,在这种情况下不使用它,因此以下循环是等效的:
U result = identity;for (T element : this stream) result = accumulator.apply(result, element)return result;
当您并行运行流时,任务将分为多个线程。因此,例如,管道中的数据被划分为多个块,这些块分别评估并产生结果。然后使用合并器合并此结果。
因此,您将不会看到一个减少的列表,而是2个值,它们是标识值或一个任务计算出的另一个值的总和。例如,如果您在合并器中添加打印语句
(i1, i2) -> {System.out.println("Merging: "+i1+"-"+i2); return i1+i2;});您可能会看到以下内容:
Merging: 0-0Merging: 0-0Merging: 1-0Merging: 1-0Merging: 1-1
这将有助于调试更复杂的情况,我相信我会最终遇到的。
更一般而言,如果您想随时随地查看管道上的数据,则可以使用
peek(或者调试器也可以提供帮助)。因此适用于您的示例:
long countOfAWords = result.stream().map(s -> s.charAt(0) == 'A' ? 1 : 0).peek(System.out::print).mapToLong(l -> l).sum();
可以输出:
100100
[免责声明:我意识到这可能不是编写此代码的最佳方法;这只是为了练习!]。
完成任务的惯用方式
filter是流式传输,然后简单地使用
count:
long countOfAWords = result.stream().filter(s -> s.charAt(0) == 'A').count();
希望能帮助到你!:)



