当前位置: 首页 > 面试题库 >

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

翟俊
2023-03-14
问题内容

我写这段代码是为了减少单词列表,以减少单词中以“ A”开头的单词的数量。我只是为了学习Java 8而编写它,所以我想更好地理解它。
[免责声明:我意识到这可能不是编写此代码的最佳方法;它可能是编写代码的最佳方法。 这只是为了练习!]

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

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

{@code
accumulator}函数充当映射器和累加器的融合,有时比单独的映射和归约更为有效,例如,当知道先前的归约值使您可以避免*某些计算时。

[作者编辑]- 以下陈述是错误的,因此请不要让您感到困惑;我只是将其保留在此处,所以我不会破坏答案的原始内容。

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

我的问题

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


问题答案:

组合器不会减少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-0
Merging: 0-0
Merging: 1-0
Merging: 1-0
Merging: 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();

希望能帮助到你!:)



 类似资料:
  • 我想要这样的东西: 我不知道如何实现…任何帮助!

  • 问题内容: 我正在尝试从三个表生成数据透视图: 学生 费用 stud_fee(关系表) 表格: 我想把费用作为专栏,学生作为行。我想使其显示为: 问题答案: 看起来您想转换成几列的费用可能未知,如果是这种情况,那么您将需要使用准备好的语句来查询以下内容: 参见带有演示的SQL Fiddle

  • 问题内容: 以下方法中的三个点是什么意思? 问题答案: 这意味着可以将零个或多个String对象(或它们的数组)作为该方法的参数传递。 请参见此处的“任意数量的参数”部分:http : //java.sun.com/docs/books/tutorial/java/javaOO/arguments.html#varargs 在你的示例中,可以将其称为以下任意一种: 重要说明:以这种方式传递的参数始

  • 我正在尝试导出一个带有透明背景的matplotlib绘图,因为它是一个圆,我需要粘贴到另一个画布上(没有角)。 我遵循了这里的示例:如何使用透明背景从matplotlib导出绘图? 示例代码: 这里给出的示例是:如何使用Matplotlib设置图形背景颜色的不透明度 示例代码: 以及这里的例子:导出图在. png与透明背景 但这对我不起作用。当我粘贴到画布上时,我最终得到: 我需要它紧紧地围绕着油

  • 当鼠标不悬停在游戏中时,我试图使游戏中的用户界面透明。但出于某种原因,当我设置图像的alpha值使其变为透明时,什么也没有发生。下面是一些可运行的代码,它复制了问题: 任何帮助都非常感谢!编辑:我收到了一个评论,有人说他们使用了自己的图像,效果很好...当我执行程序时,我会收到这个警告: 是因为我的文件,所以不能正常运行的原因吗?

  • 问题内容: 我有一个源输入 input.txt 我想将这些输入馈入程序,如下所示: 所以我尝试使用 xargs ,但是没有运气。 它给 但我想要 任何的想法? 问题答案: 到目前为止给出的解决方案都无法正确处理包含空格的文件名。如果文件名包含“或”,有些甚至会失败。如果输入文件是由用户生成的,则应该准备好使用令人惊讶的文件名。 GNU Parallel 很好地处理了这些文件名,并为您(至少)提供了