Lambda 为什么forEach循环中的变量不应该更改?

Lambda 为什么forEach循环中的变量不应该更改?,lambda,java-8,Lambda,Java 8,我在Java7循环和Java8forEachloop中迭代一个列表。Java8循环希望其中的变量不发生变化。例如: List testList=Arrays.asList(“苹果”、“香蕉”、“猫”、“狗”); 整数计数=0; testList.forEach(测试->{ count++;//编译错误:在封闭范围中定义的局部变量count必须是final或有效final }); for(字符串测试:testList){ count++;//代码运行正常 } 有人能解释一下原因吗?这是Java

我在Java7循环和Java8
forEach
loop中迭代一个列表。Java8循环希望其中的变量不发生变化。例如:

List testList=Arrays.asList(“苹果”、“香蕉”、“猫”、“狗”);
整数计数=0;
testList.forEach(测试->{
count++;//编译错误:在封闭范围中定义的局部变量count必须是final或有效final
});
for(字符串测试:testList){
count++;//代码运行正常
}

有人能解释一下原因吗?这是Java 8的一个缺点吗?

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


通常,当您使用lambdas时,您试图以功能性的方式编程。但在函数式编程中,可变变量被认为是不好的做法:最好只给每个变量赋值一次。因此,试图修改局部变量实际上是有味道的。使用各种流缩减方法,而不是
forEach
,以生成一个好的功能代码。

谢谢!我还发现这个链接非常有用。