【问题标题】:What is the benefit being able to use effectively final variables in Java 8 lambda expressions能够在 Java 8 lambda 表达式中有效使用最终变量有什么好处
【发布时间】:2014-06-10 09:50:52
【问题描述】:

我已经理解Difference between final and effectively final 解释的“有效最终”的含义。

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

只是将final的类型保存在变量之前吗?或者能够有效使用最终变量的能力还有其他优势吗?

【问题讨论】:

    标签: java lambda java-8


    【解决方案1】:

    简单的答案是,由于final 和“有效最终”变量之间没有区别,除了在声明中的关键字final 之外,唯一的目的是允许省略final 关键字。

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

    对于 lambda 表达式,参数的整个声明可以简化为 x -> x+1。现在考虑嵌套的 lambda 表达式,例如:x -> y -> x+y 以及如果我们在此处强制将 final 声明添加到 x 参数会产生的视觉混乱。

    由于没有 Java 语法可以将变量声明为 final 而不指定其类型,因此要么需要规范向语言添加更复杂的构造,要么强制我们添加 final 和类型声明将简单表达式x -> y -> x+y 转换为(final double x) -> y -> x+y 的参数。

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

    【讨论】:

      【解决方案2】:

      您可以将其视为扩展 Java 中的 类型推断 的范围,以包括推断局部变量的最终性,以便在 lambda 表达式和内部类中捕获。规则没有改变——lambdas 和内部类捕获值,而不是变量——但符合规则的语法负担已经减轻。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-29
        • 1970-01-01
        相关资源
        最近更新 更多