如何在Java中找到与forEach和lambda表达式的和?

Mon*_*mer 3 java lambda java-8

以下代码段无法编译.如何找到如下所示的sum使用forEach方法?

private int Sum(ArrayList<Integer> inputs) {
    int sum = 0;

    inputs.stream().forEach(x -> sum += x);

    return sum;
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*s K 5

这应该做的伎俩:

private int Sum(ArrayList<Integer> inputs) {

  return inputs.stream().mapToInt(Integer::intValue).sum();

}
Run Code Online (Sandbox Code Playgroud)

编辑:

使用的问题for-each是它是一个终端操作,这意味着它不会产生另一个中间流供我们使用.更好的方法是使用mapToInt哪个产生IntStream我们可以很容易地找到总和.


Ous*_* D. 5

这个答案只是为了提供更多背景信息来说明为什么您的代码不起作用,从而使您能够破译问题(如果将来发生)。

看起来您是一名 .NET 用户,这使得人们完全可以理解您所编写的代码能够正常工作。与 .NET 中一样,等效项是:

private int Sum(List<int> inputs) {
        int sum = 0;
        inputs.ForEach(x => sum += x);
        return sum;
}
Run Code Online (Sandbox Code Playgroud)

然而,在 java 中,lambda 表达式中使用的变量必须是Final有效的 Final,因此该语句inputs.stream().forEach(x -> sum += x);将无法编译。

然而,仅仅因为人们期望上述代码在 C# 中工作并不一定意味着它应该在 Java 中工作,因为有不同的规则。

有一些解决方案可以使用该方法查找一组数字的总和forEach,但这不是惯用的方法,因此除非必要,否则应避免使用。

惯用的方法正如 @Nicholas K 所示。

另一个注意事项:

  • 即使在 .NET 中,惯用的方法也不是return inputs.Sum(); 使用ForEach扩展方法来对给定列表的元素求和。
  • 每当您似乎看到自己inputs.stream().forEach(...);在 java 中使用时,您应该这样做inputs.forEach(...),因为所有列表都有一个forEach方法。
  • Java 中的方法名称应采用驼峰命名法,而不是 C# 中的 PascalCasing。