Java8有效地解决了非最终变量的最终编译时错误

Java8有效地解决了非最终变量的最终编译时错误,java,lambda,java-8,Java,Lambda,Java 8,我试图将java8foreach循环中的布尔变量改为true,这是非final的。但我得到了以下错误:封闭范围中定义的必需局部变量必须是final或实际上是final 如何解决此错误 代码: boolean required = false; 这是我在函数中创建的变量 现在,当我试图改变它时: map.forEach((key, value) -> { System.out.println("Key : " + key + " Value : " + value)

我试图将java8foreach循环中的布尔变量改为true,这是非final的。但我得到了以下错误:封闭范围中定义的必需局部变量必须是final或实际上是final

如何解决此错误

代码:

boolean required = false; 
这是我在函数中创建的变量

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

   map.forEach((key, value) -> {
        System.out.println("Key : " + key + " Value : " + value);
        required = true;
    });
我得到了一个错误:在封闭范围中定义的必需局部变量必须是final或实际上是final


出现此错误的原因及解决方法?

不能从lambda表达式的主体中更改局部变量。有几种方法可以克服这一问题:

  • 在这种特殊情况下,您只需设置
    boolean required=!map.isEmpty()不带任何lambda表达式。如果要根据某些条件进行设置,可以使用流API:

    boolean required = map.entrySet().stream().anyMatch(entry -> ...);
    
    这种解决方案是最受欢迎的

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

  • 最脏的方法:声明一个单元素数组:
    boolean[]required={false}
    并改为设置此元素:
    required[0]=true

类似的内容:最肮脏的方式:声明一个单元素数组:boolean[]required={false};并改为设置此元素:required[0]=true;我真的很想做,但正如你说的,它看起来很脏。有没有其他方法可以更改lambda表达式中的局部变量@tagirValeev@Siddharth,实际上无法更改局部变量。在
boolean[]required
的情况下,您不更改局部变量,而是更改heap对象。为了增强我的知识,请您解释一下您更改head对象而不更改局部变量的实际含义@Tagirvaleva比单元素数组稍微简单一点的方法是使用
原子布尔
,它可以通过
set(boolean)
方法更改其值。是的,即使将布尔变量封装在类中并使用它也可以@德卡采尔