以下是使用数组document.getElementsByClassName
而不是int[]
的代码示例。包含int
的所有行都显示在下面的代码中。这个方法由几个线程执行。
i
这是一个获得可变计数器的解决方法吗?
为什么它可能是最终的"? (没有int[] i = {0}; //So the stream forEach doesn't complain about a potentially final variable to use...
result.forEach (currentOptionRow -> {
String bgColor = (0 == i[0] % 2) ? "eaeaea" : "ffffff";
//Create HTML, use bgColor to generate alternating background
i[0]++;
});
个关键字,为什么要关注?)
答案 0 :(得分:3)
这是处理lambda要求所必需的解决方法。 lambda的局部变量必须是最终的或有效的最终变量。
不,如果你想使用lambda,你不能用int
替换它。
您可以更改final int[]
中存储的元素的值。这就是为什么你可以在lambda中使用它作为一个计数器。
答案 1 :(得分:2)
确实lambdas以某种方式演变为匿名类,所以当你想使用局部变量时,这个变量必须声明为final
。
在java 8中,他们添加了effectively final
的概念,这意味着即使未使用final
关键字明确定义,它仍被视为final
,因为它已设置代码中只有一次。这是为了促进开发人员采用lambda表达式而增加的一项改进,因为他们不再需要用final
个关键字来污染他们的代码,他们只需要专注于他们的lambda表达式。
所以你确实不能使用int
类型的简单局部变量作为计数器,因为它无法修改,但你可以使用AtomicInteger
或array
作为你那样。
如果您使用匿名类而不是lambda,则可以按照下一步完成:
result.forEach(new Consumer<String>() {
int i;
@Override
public void accept(final String currentOptionRow) {
String bgColor = (0 == i % 2) ? "eaeaea" : "ffffff";
//Create HTML, use bgColor to generate alternating background
i++;
}
});