【问题标题】:How to find sum with forEach and lambda expression in Java? [duplicate]如何在 Java 中使用 forEach 和 lambda 表达式求和? [复制]
【发布时间】:2019-03-18 14:24:26
【问题描述】:

以下 sn -p 无法编译。如下图如何使用forEach找到sum

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

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

    return sum;
}

【问题讨论】:

  • @Pau 目前在两个接受的答案中都可以找到inputs.stream().mapToInt(Integer::intValue).sum(); 这一行。这两种情况下的问题是如何使用forEach 找到整数的List 的总和。为什么不是重复的?

标签: java lambda java-8


【解决方案1】:

这应该可以解决问题:

private int Sum(ArrayList<Integer> inputs) {

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

}

编辑:

使用for-each 的问题在于它是一个终端操作,这意味着它不会产生另一个中间流供我们处理。更好的方法是使用mapToInt,它会生成一个IntStream,我们可以在上面轻松找到总和。

【讨论】:

  • 是的,感谢您的勤奋
【解决方案2】:

这个答案只是为了提供更多关于为什么您的代码不起作用的上下文,因此如果将来发生问题,您可以破译问题。

您似乎是一名 .NET 用户,这让人们完全可以理解您编写的代码可以正常工作。与 .NET 中的等价物是:

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

但是,在 lambda 表达式中使用的 java 变量必须是 finaleffectively final,因此语句 inputs.stream().forEach(x -&gt; sum += x); 将无法编译。

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

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

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

另外说明:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 2018-09-29
    • 2017-06-10
    • 2021-10-11
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    相关资源
    最近更新 更多