Java8有效地对非最终变量进行最终编译时错误

Sid*_*eva 7 java lambda java-8

我正在尝试将java8 forEach循环中的布尔变量更改为true,这是非final.但是我遇到了以下错误:在封闭范围内定义的局部变量必须是最终的或有效的最终.

如何解决此错误?

代码:

boolean required = false; 
Run Code Online (Sandbox Code Playgroud)

这是我在函数中创建的变量.

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

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

我收到错误:在封闭范围内定义的本地变量必须是最终的或有效的最终.

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

Tag*_*eev 7

您无法从lambda表达式的主体更改局部变量.有几种方法可以解决这个问题:

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

    boolean required = map.entrySet().stream().anyMatch(entry -> ...);
    
    Run Code Online (Sandbox Code Playgroud)

    该解决方案是最优选的.

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

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

  • 比单元素数组稍微不那么丑陋的方法是使用`AtomicBoolean`代替它可以通过`set(boolean)`方法改变它的值. (4认同)
  • @Siddharth,实际上没有办法改变局部变量.在`boolean [] required`情况下,您不更改局部变量,而是更改堆对象. (3认同)