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

时间:2014-06-10 09:50:52

标签: java lambda java-8

我已经理解Difference between final and effectively final所解释的“有效最终”意味着什么。

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

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

2 个答案:

答案 0 :(得分:14)

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

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

对于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特征),但表现力有明显的好处,不仅因为你可以省略{{1修饰符,但它有帮助。它与一起与改进的类型推断,新的编程API,当然还有lambda表达式和方法引用一起工作。

答案 1 :(得分:5)

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