当前位置: 首页 > 知识库问答 >
问题:

能够在Java 8 lambda表达式中有效地使用final变量有什么好处

闻人鸿文
2023-03-14

我已经理解了“有效最终”的含义,正如最终和有效最终之间的差异所解释的那样。

我不明白的是,为什么lambda表达式/烦人的内部类需要使用有效的最终变量?为什么Java 8会放宽变量必须声明为最终变量的限制?

仅仅是为了保存变量前的< code>final的键入吗?或者,能够有效地使用最终变量的能力是否有其他优势?

共有2个答案

鲍钊
2023-03-14

你可以认为这是扩展了Java中类型推断的范围,包括推断局部变量的终结性,以便在lambda表达式和内部类中进行捕获。规则没有改变——lambdas和内部类捕获值,而不是变量——但是符合规则的语法负担减轻了。

苏胤
2023-03-14

简单的回答是,因为除了声明中的关键字< code>final之外,< code>final和“effectively final”变量之间没有区别,唯一的目的是允许省略< code>final关键字。

但这可能比你意识到的影响更大。

对于 lambda 表达式,参数的整个声明可以简化为 x -

由于没有Java语法在不指定变量类型的情况下将变量声明为< code>final,因此要么需要规范向语言中添加更复杂的结构,要么强制我们向参数添加< code>final和类型声明,从而将简单表达式< code>x -

主要目标是为Java程序员提供一种简化(在添加新的编程语言特性时尽可能做到这一点)。当然,它没有为语言提供任何功能来解决以前没有它就无法解决的问题(这适用于整个lambda功能),但在表达能力方面有显著的提高,这不仅是因为您可以省略< code>final修饰符,而且这很有帮助。它与改进的类型推断、新的编程API,当然还有lambda表达式和方法引用一起工作。

 类似资料:
  • 问题内容: 我已经理解了“有效最终”的含义,正如“最终”和“有效最终”之间的区别所解释的。 我不明白的是为什么对于lambda表达式/异常内部类需要使用有效的最终变量?Java 8为什么要放松其必须将变量声明为final的限制? 只是保存变量之前的类型吗?还是能够有效使用最终变量的能力还有其他优势? 问题答案: 简单的答案是,由于变量和“有效最终”变量之间没有区别,除了声明中的关键字外,唯一的目的

  • lambda表达式中使用的变量应为final或有效final 当我尝试使用时,它显示了这个错误。

  • 问题内容: lambda表达式中使用的变量应该是final或有效的final 当我尝试使用它时会显示此错误。 问题答案: 可变装置,它可以被实例化一次。在Java中,你不能在lambda以及匿名内部类中使用非最终变量。 你可以使用旧的for-each循环来重构代码: 即使我对这段代码有些不了解: 你调用;而不使用其返回值 使用分配,;你不会修改原始传递的内容,并且你不会在此方法中使用它 你总是返回

  • 我有一个JavaFX 8程序(用于JavaFXPorts交叉平台),几乎可以做我想做的事情,但又短了一步。该程序读取文本文件,对行进行计数以建立随机范围,从该范围中选取一个随机数,然后读取该行以进行显示。 我对java有点陌生,但似乎我是否使用Lambda在中显示下一个随机行,我的

  • 我在Java练习lambda表情。我知道局部变量需要是最终的,或者根据Java SE16 Lambda Body的Oracle文档,实际上是最终的: 在lambda表达式中使用但未声明的任何局部变量、形参或异常参数必须是final或有效final(§4.12.4),如§6.5.6.1中所规定的。 但上面没有说明原因。搜索我发现了这个类似的问题,为什么lambdas中的变量必须是final或者实际上

  • 问题内容: 我有一个JavaFX 8程序(用于跨平台的JavaFXPorts),可以完成我想做的事情,但只差了一步。该程序读取一个文本文件,对行进行计数以建立一个随机范围,从该范围中选择一个随机数,然后读取该行以进行显示。 我对Java有点陌生,但是似乎我是否使用Lambda都不显示下一个随机行,我的行期望一个静态值。 有什么想法可以调整我必须在每次按下屏幕按钮时简单显示var readln2的下