当前位置: 首页 > 面试题库 >

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

艾嘉石
2023-03-14
问题内容

我正在尝试将java8
forEach循环内的布尔变量更改为true,这是非最终的。但是我遇到了以下错误:在封闭范围内定义的必需局部变量必须是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;



 类似资料:
  • 我正在使用RxVertx,它是一种RxJava和Java8,我有一个编译错误。 这是我的代码: 编译错误是:“在封闭范围内定义的局部变量游戏必须是最终的或有效的最终的” 我无法将“game”定义为final,因为我在函数末尾执行分配\set并返回它。 如何编译此代码? 谢了。

  • 在Java8中,Java设计者提出了一个有效的final变量的概念,即一个如果被“final”追加就不会给编译器带来错误的变量。我的问题是,这个新提出的“有效最终”概念比经典的“最终”提供了什么?作为一名Java开发人员,我实际上得到了什么好处?

  • 问题内容: 最终变量和编译时间常数之间有什么区别? 考虑以下代码 这是什么意思?何时以及如何为最终变量分配值?在运行时会发生什么,在编译时会发生什么?为什么要给switch一个编译时间常数?Java还有哪些其他结构需要编译时间常数? 问题答案: 问题在于, 所有语句在编译时 都 必须是最终的 。您的第一个陈述 是最终决定 。对于100%,除以外没有其他值。 然而,这 不能保证 对。如果周围有一个i

  • 如何在Java 8 lambda中使用非final变量。它抛出编译错误,称“封闭范围中定义的局部变量日期必须是final或实际上是final” 我实际上想实现以下目标: 如何实现此目的?它会为 date2 引发 comilation 错误。谢谢

  • 问题内容: 这个问题已经在这里有了答案 : 为什么在匿名类中只能访问最终变量? (15个答案) 为什么实例变量“忽略Lambda表达式中使用的变量必须是最终变量或实际上是最终变量”警告[重复] (2个答案) Lambdas:局部变量不需要最终变量,实例变量不需要 (10个答案) 2年前关闭。 当我编写此代码时,我收到一个编译时错误,该错误是: “ lambda中的变量必须是final或有效的fin

  • 配置选项 要做到最大限度的定制每一个软件包,获取完整的配置选项是必须的。当然,要想更加详细、全面的了解如何自定义安装,还需要查看 README INSTALL FAQ 之类的文档,甚至是软件包的官方手册。需要注意的是,有不少软件包的配置选项分布在多个 configure 脚本中,还有少数并不是通过 configure 脚本进行配置的,查看完整的配置信息就变成一件很吃力的事情了。因此唯一的建议就是: