lambda变量作用域

访问外围变量

lambda表达式可以捕获外围作用域中变量的值。

var str1 = "hello";
var str2 = "java";

testConsumer(str1, str->
   System.out.println(str + " " + str2)
);

但在lambda表示式中,不能修改外围变量的值。下面的做法是不合法的:

var str1 = "hello";
var str2 = "java";
testConsumer(str1, str->
             {
                 str2 = " " + str2;  // error
                 System.out.println(str + str2);
             }
);

如果 lambda表达式中引用一个变量,而这个变量可能在外部改变,这也是不合法的。下面就是不合法的:

for (int i=0; i < strs.length; i ++)
{
    testConsumer(strs[i], str->System.out.println(i + str));  //error
}

结合上述三个例子,我们可以总结出:lambda表达式中捕获的变量必须实际上是实时最终变量。

this

在lambda表达式中的this,是指创建这个lambda表达式方法的this参数。