stream.foreach 中的 java 8 局部变量

标签 java lambda java-8 java-stream local-variables

<分区>

我想在 lambda 函数中使用局部变量,但出现错误: 请参阅代码中的 1. 和 2. 点。

class Foo {
    int d = 0; // 1. It compiles, but ugly, 2. doesnt compile
    public void findMax(List<List<Route>> routeLists) {
        int d = 0; // 2.Error : Local variable dd defined in an enclosing scope must be final or effectively final
        routeLists.forEach(e-> {
            e.forEach(ee -> {
                d+=ee.getDistance();    
            });

        });
        ... doing some other operation with d
    }
}

如何在不将它们设置为全局变量的情况下使用它们?

最佳答案

forEach 是错误的工具。

int d =
    routeLists.stream()                // Makes a Stream<List<Route>>
        .flatMap(Collection::stream)   // Makes a Stream<Route>
        .mapToInt(Route::getDistance)  // Makes an IntStream of distances
        .sum();

或者只使用嵌套的 for 循环:

int d = 0;
for (List<Route> rs : routeLists) {
  for (Route r : rs) {
    d += r.getDistance();
  }
}

关于stream.foreach 中的 java 8 局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49273149/

相关文章:

java - URI 的引用没有使用 Apache Santuario 的 XMLSignatureInput

c++11 - C++ 如何存储 lambda 捕获的超出范围的变量?

c# - 基于KeyValuePairs的过滤列表

lambda - 如何将参数传递给 Java 8 Lambda 流函数?

java - 如何使用流在没有冗余代码的情况下获取嵌套集合的最小/最大元素?

java - 使用 Lambda 表达式进行列表迭代 - 局部变量必须是最终变量或有效最终变量

java - 如何将位置区号转换为地址?

java - Google App Engine 通过键获取对象

java - 使用 Java 解压并重新打包 jar 会导致 jar 文件损坏

c# - 编译的 C# lambda 表达式性能与叠层