Java8有效地解决了非最终变量的最终编译时错误
我试图将java8foreach循环中的布尔变量改为true,这是非final的。但我得到了以下错误:封闭范围中定义的必需局部变量必须是final或实际上是final 如何解决此错误 代码: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)
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
的情况下,您不更改局部变量,而是更改heap对象。为了增强我的知识,请您解释一下您更改head对象而不更改局部变量的实际含义@Tagirvaleva比单元素数组稍微简单一点的方法是使用原子布尔
,它可以通过set(boolean)
方法更改其值。是的,即使将布尔变量封装在类中并使用它也可以@德卡采尔