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

我已经理解了“有效最终”意味着什么,正如最终和有效最后的差异所解释的那样。

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

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

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

但这可能比你所知道的更具影响力。

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

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

主要目标是为Java程序员提供简化 (在添加新的编程语言function时可以这样做)。 当然,它没有为语言提供任何function来解决在没有它之前无法解决的问题(这适用于整个lambda特征),但是表现力有明显的好处,不仅因为你可以省略final修饰符而且它有助于。 它与改进的类型推断,新的编程API,当然还有lambda表达式和方法引用一起工作。

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