java lambda 的作用域(scope)

core-java
标签: #<Tag:0x00007f1d26075040>

#1

大家先看看这个例子

public class LambdaScope {

    private String global;

    public void test(String value) {
        String internal = null;

        Function<String, String> func1 = x -> {
//            String internal = "";  //编译报错

//            value = "value"; //编译报错
            System.out.println(value);

            global = "global";
            System.out.println(global);

//            internal = "internal"; // 编译报错
            System.out.println(internal);
            return x;
        };

        System.out.println(func1.apply("2112"));
    }

    public void test2() {
        Function<String, String> func1 = x -> {
            System.out.println(this.global);
            return x;
        };
        System.out.println(func1.apply("2121"));
    }
}

我来总结上边例子中出现的几种情况

  1. lambda 表达式里可以读方法里的变量和传入方法的参数. 但是不能写, 也就是说它们对 lambda 来说其实是 final 的, 虽然没有标明fianl.

  2. lambda 表达式中可以对类的属性做读写操作.

  3. lambda 表达式里定义的变量不能与方法的变量或方法的入参重名, 这个比较好理解, 因为可以直接使用方法的变量和参数嘛.

  4. lambda 中的 this其实就是方法中this.