Java8有效的最终编译时错误的非最终变量



我试图将java8 forEach循环中的布尔变量更改为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表达式。如果你想基于某些条件设置它,你可以使用Stream API:

    boolean required = map.entrySet().stream().anyMatch(entry -> ...);
    
  • required变量转换为封闭类的字段

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

相关内容

最新更新