使用数组而不是int来处理"潜在的最终变量"在Java中。

时间:2016-06-28 15:36:58

标签: java final

以下是使用数组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]++; }); 个关键字,为什么要关注?)

2 个答案:

答案 0 :(得分:3)

这是处理lambda要求所必需的解决方法。 lambda的局部变量必须是最终的或有效的最终变量。

不,如果你想使用lambda,你不能用int替换它。

您可以更改final int[]中存储的元素的值。这就是为什么你可以在lambda中使用它作为一个计数器。

答案 1 :(得分:2)

确实lambdas以某种方式演变为匿名类,所以当你想使用局部变量时,这个变量必须声明为final

在java 8中,他们添加了effectively final的概念,这意味着即使未使用final关键字明确定义,它仍被视为final,因为它已设置代码中只有一次。这是为了促进开发人员采用lambda表达式而增加的一项改进,因为他们不再需要用final个关键字来污染他们的代码,他们只需要专注于他们的lambda表达式。

所以你确实不能使用int类型的简单局部变量作为计数器,因为它无法修改,但你可以使用AtomicIntegerarray作为你那样。

如果您使用匿名类而不是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++;
    }
});