【问题标题】:Why should variables inside a forEach loop not be changed?为什么不应该更改 forEach 循环中的变量?
【发布时间】:2015-08-04 05:28:56
【问题描述】:

我在 Java 7 循环和 Java 8 forEach 循环中迭代一个列表。 Java 8 循环希望其中的变量不改变。例如:

List<String> testList = Arrays.asList( "apple", "banana", "cat", "dog" );
int count = 0;

testList.forEach(test -> {
  count++; // Compilation error: Local variable count defined in an enclosing scope must be final or effectively final
});

for (String test : testList) {
  count++; // Code runs fine
}

有人能解释为什么吗?这是 Java 8 的缺点吗?

【问题讨论】:

    标签: lambda java-8


    【解决方案1】:

    Java 内存模型有一个非常重要的属性:它保证局部变量和方法参数永远不会被另一个线程写入。这为多线程编程增加了很多安全性。但是,当您创建 lambda(或匿名类)时,没有人知道它将如何使用。它可以传递给另一个线程执行(例如,如果您使用parallelStream().forEach(...))。是否可以修改将违反重要属性的局部变量。不是 Java 语言开发人员会牺牲的东西。

    通常,当您使用 lambda 时,您会尝试以函数式方式进行编程。但是在函数式编程中,可变变量被认为是不好的做法:最好只分配每个变量一次。所以试图修改局部变量实际上是有味道的。使用各种流缩减方法而不是forEach 来生成良好的功能代码。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 2012-06-29
    相关资源
    最近更新 更多