能够在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和内部类捕获值而不是变量 – 但是符合规则的语法负担已经减少了。