Lambda 表达式的变量与作用域
本节我们将分析 Lambda 表达式的局部变量及其作用域进行分析,在这基础上我们会探讨其访问规则背后的原因。
在开始之前我们需要明确一句话:
引用值,而不是变量!
引用值,而不是变量!
引用值,而不是变量!
重要的事情说三遍!!!
1. 访问局部变量
Lambda 表达式不会从父类中继承任何变量名,也不会引入一个新的作用域。Lambda 表达式基于词法作用域,也就是说 Lambda 表达式函数体里面的变量和它外部环境的变量具有相同的语义。
访问局部变量要注意如下 3 点:
- 可以直接在 Lambda 表达式中访问外层的局部变量;
- 在 Lambda 表达式当中被引用的变量的值不可以被更改;
- 在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。
现在我们来仔细说明下这三点。
1.1 可以直接在 Lambda 表达式中访问外层的局部变量
在 Lambda 表达式中可以直接访问外层的局部变量,但是这个局部变量必须是声明为 final
的。
首先我们来看一个例子: