2015-08-28 74 views
6

我试图改变java8 forEach循环内的布尔变量为true,这是非最终的。但是我得到以下错误:在封闭范围内定义的本地变量必须是最终的或有效的最终。Java8有效最终编译时间错误非最终变量

如何解决此错误?

代码:

boolean required = false; 

这是我在函数创建的变量。

现在,当我试图去改变它:

map.forEach((key, value) -> { 
     System.out.println("Key : " + key + " Value : " + value); 
     required = true; 
    }); 

我得到的错误:在一个封闭的范围局部变量需要定义必须是最后的或有效的决赛。

为什么会出现此错误以及如何解决?

回答

6

您不能从lambda表达式的主体中更改局部变量。有几种方法来解决这个问题:

  • 在你可以设置boolean required = !map.isEmpty();没有任何lambda表达式这种特殊情况下。如果您想根据某些条件进行设置,则可以使用Stream API:

    boolean required = map.entrySet().stream().anyMatch(entry -> ...); 
    

    此解决方案是最受欢迎的。

  • required变量转换为封闭类的字段。

  • 最肮脏的方式:声明一个元素的数组:boolean[] required = {false};和设置此元素代替:required[0] = true;
+1

像这样:最肮脏的方式:声明一个元素的数组:[]需要布尔= {假};并设置此元素:required [0] = true; 我其实想要做的事情,但你说它看起来很脏。是否有任何其他方式来更改lambda表达式中的局部变量@tagirValeev –

+3

@Siddharth,实际上没有办法改变局部变量。在'boolean [] required'的情况下,你不改变局部变量,而是改变堆对象。 –

+1

为了增强我的知识,可以请你解释一下你通过改变头对象而不是改变局部变量来实际上是什么意思。 @tagirValeev –