1.访问局部变量
可以直接在lambda表达式中访问外层的局部变量
final int num = 1;
Converter<Integer, String> s =
(param) -> String.valueOf(param + num);
s.convert(2); // 3
但是和匿名对象不同的是,lambda表达式的局部变量(eg:num)可以不用声明为final
int num = 1;
Converter<Integer, String> s =
(param) -> String.valueOf(param + num);
stringConverter.convert(2); // 3
不过这里的局部变量(eg:num)必须不可被后面的代码修改(即隐性的具有final的语义)
eg:下面代码无法编译
int num = 1;
Converter<Integer, String> s =
(param) -> String.valueOf(param + num);
num = 5;
Note:在Lambda表达式中试图修改局部变量是不允许的。
2)在 Lambda 表达式当中被引用的变量的值不可以被更改
public void repeat(String string, int count) {
Runnable runnable = () -> {
for (int i = 0; i < count; i++) {
string = string + "a";//编译出错
System.out.println(this.toString());
}
};
new Thread(runnable).start();
}
https://blog.youkuaiyun.com/sun_promise/article/details/51132916