lambda表达式的变量作用域问题 1、合法引用外部变量2、非法引用外部变量(lambda改变)3、非法引用外部变量(外部改变)4、lambda表达式中不可出现同名局部变量5、lambda中使用this关键字 1、合法引用外部变量 import javax.swing.*; import java.awt.event.ActionListener; public class App { public static void repeatMessage(String text, int delay) { ActionListener listener = event -> { System.out.println(text); }; new Timer(delay, listener).start(); } public static void main(String[] args) { /** * 代码运行现象,在repeatMessage函数返回后,任然可以输出"tangxin", * 这是为什么呢? * 因为text对于lambda表达式来说是自由变量,lambda表达式存在自由变量时, * 则lambda表达式将捕获这个值,左右在函数退出后,监听器任然可以打印这个值 */ App.repeatMessage("tangxin", 1000); System.out.println("repeatMessage返回"); while(true); } } 2、非法引用外部变量(lambda改变) 当试图改变外部变量传递给text的值时,将会报错 3、非法引用外部变量(外部改变) 当引用的外部变量可能会被重新赋值时,也是非法的。 4、lambda表达式中不可出现同名局部变量 在lambda表达式中不可有同名的局部变量 5、lambda中使用this关键字 import javax.swing.*; import java.awt.event.ActionListener; public class App { public void repeatMessage(String text, int delay) { ActionListener listener = event -> { System.out.println(text); /** * 在一个lambda表达式中使用this关键字时, * 是指创建这个lambda表达式的方法的this参数 * 也就是App的对象 */ System.out.println(this.toString()); }; new Timer(delay, listener).start(); } public static void main(String[] args) { App text = new App(); text.repeatMessage("tangxin", 1000); while(true); } }