【发布时间】:2015-10-29 08:57:37
【问题描述】:
在Java中我有以下代码
List<Integer> myList = new ArrayList<>();
for (int i=0;i<9;i++) {
myList.add(i);
}
Integer sum = 0;
myList.forEach(i -> {
sum = sum + i; // does not compile, sum needs to be final or effectively final
});
for(int i : myList) {
sum = sum + i; //runs without problems
}
我的问题是,为什么我不能从 lambda 中更改 sum 的值?它与下面的 for 循环完全相同,还是我错了?有趣的是,如果我将主方法之外的整数和声明为静态,它也可以工作。谁能解释我为什么?
编辑:在另一个类似的问题Does Java 8 support closures 中,答案似乎是:
它是向后兼容性和项目资源限制的结合。
但是,如果我将 sum 设为数组或在 main 之外声明它,我仍然无法理解为什么它会起作用。我还想了解 myList.forEach 和下面的 for 循环之间有什么区别,为什么一个有效而另一个无效。
【问题讨论】:
-
另外,由于您运行的是 Java 8,您可能需要考虑使用
myList.stream().forEach。见java.util.Stream。
标签: java foreach lambda anonymous-inner-class