关于lamada表达式变量作用域的几点说明

/*
* Lamada表达式的变量作用域
 */
public class Test06 {

    public static void main(String[] args) {

        /**
         * lamada表达式有三个部分:
         * 1)一个代码块
         * 2)参数
         * 3)自由变量的值,这是指非参数而且不在代码中定义的变量
         */

        countDown(10, 10);
    }

    //1,在lamada表达式中,只能引用值不会改变的变量,如下面的一个就是不合法的:
    private static void countDown(int start, int delay) {
        ActionListener listener = event ->
        {
            start--;//Error: Can't mutate captured varible;
            System.out.println(start);
        };
        new Timer(delay, listener).start();

    }

    //2,在lamada表达式中引用变量,而这个变量可能在外部改变,这也是不合法的。
    private static void repeat(String text, int count) {
        for (int i = 0; i < count; i++) {
            ActionListener listener = event ->
            {
                System.out.println(i + ": " + text);//Error: Cannot refer to changing i
            };
            new Timer(1000, listener).start();
        }

    }

    //3,在lamada表达式中声明与一个局部变量同名的参数或局部变量是不合法的
    Path firth = Paths.get("/usr/bin");
    Comparator comp =
            (first, second) -> first.length() - second.length();//Error:Varible first already defined


}

你可能感兴趣的:(关于lamada表达式变量作用域的几点说明)