相关疑难解决方法(0)

带有3个参数的Java8 stream.reduce() - 获得透明度

我编写了这段代码,将一个单词列表缩减为多少单词以'A'开头.我只是为了学习Java 8而写它,所以我想更好地理解它[免责声明:我意识到这可能不是编写这段代码的最好方法; 这只是为了练习!].

Long countOfAWords = results.stream().reduce(
    0L,
    (a, b) -> b.charAt(0) == 'A' ? a + 1 : a,
    Long::sum);
Run Code Online (Sandbox Code Playgroud)

中间参数/ lambda(称为累加器)似乎能够在没有最终'Combiner'参数的情况下减少完整列表.事实上,Javadoc实际上说:

{@code accumulator}函数充当融合映射器和累加器*,它有时比单独的映射和缩减更有效,*例如当知道先前减少的值允许您避免*某些计算时.

[编辑来自作者] -以下陈述是错误的,所以不要让它混淆你; 我只是把它放在这里,所以我不会破坏答案的原始背景.

无论如何,我可以推断累加器必须只输出组合器组合的1和0.我没有从文档中发现这一点特别明显.

我的问题

有没有办法在组合器执行之前查看输出是什么,所以我可以看到组合器组合的1和0的列表?这将有助于调试更复杂的情况,我相信我最终会遇到这种情况.

java reduce accumulate java-8 java-stream

7
推荐指数
1
解决办法
2542
查看次数

为什么在java-8流减少操作中不执行组合器功能?

我试图了解流中的 reduce 方法是如何工作的。

Stream.of(1,2,3,4,5,6,7).reduce(new ArrayList<>(),
(List<Integer> l, Integer a) -> {l.add(a);return l;},
(List<Integer> l1, List<Integer> l2) -> {
System.out.println("l1 is" + l1 + "l2 is " + l2);
l1.addAll(l2);
return l1;
}).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

该行System.out.println("l1 is" + l1 + "l2 is " + l2)永远不会被打印。我可以理解发生了什么,(List<Integer> l, Integer a) -> {l.add(a);return l;}
有人可以解释为什么没有打印出来吗?java文档说function for combining two values, which must be compatible with the accumulator function

谢谢,阿马尔

java java-8 java-stream

4
推荐指数
1
解决办法
942
查看次数

标签 统计

java ×2

java-8 ×2

java-stream ×2

accumulate ×1

reduce ×1