跳到主要内容

Lambda 表达式的变量与作用域

本节我们将分析 Lambda 表达式的局部变量及其作用域进行分析,在这基础上我们会探讨其访问规则背后的原因。

在开始之前我们需要明确一句话:

引用值,而不是变量!

引用值,而不是变量!

引用值,而不是变量!

重要的事情说三遍!!!

1. 访问局部变量

Lambda 表达式不会从父类中继承任何变量名,也不会引入一个新的作用域。Lambda 表达式基于词法作用域,也就是说 Lambda 表达式函数体里面的变量和它外部环境的变量具有相同的语义。

访问局部变量要注意如下 3 点:

  1. 可以直接在 Lambda 表达式中访问外层的局部变量;
  2. 在 Lambda 表达式当中被引用的变量的值不可以被更改;
  3. 在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。

现在我们来仔细说明下这三点。

1.1 可以直接在 Lambda 表达式中访问外层的局部变量

在 Lambda 表达式中可以直接访问外层的局部变量,但是这个局部变量必须是声明为 final 的。

首先我们来看一个例子: