lambda

表达式实例

package main.java;

/**
 * lambda实例
 */
public class LambdaExample {

    public static void main(String[] args) {
        //类型声明
        MathOperation addition = (int a, int b) -> a + b;
        System.out.println("类型声明: "+addition.operation(1,2));
        //不用类型声明
        MathOperation addition1 = (a,b) -> a+b;
        System.out.println("不用类型声明: "+addition.operation(1,2));
        // 大括号中的返回语句
        MathOperation multiplication = (int a, int b) -> { return a * b; };
        System.out.println("大括号中的返回语句: "+multiplication.operation(1,3));
        MathOperation getAddition = new MathOperation() {
            @Override
            public int operation(int a, int b) {
                return a+b;
            }
        };
        System.out.println("原来的方式: "+getAddition.operation(1,2));
        System.out.println("-----------------------------------------------------------------------------");
        // 原来的方式
        GreetingService greetService1 = new GreetingService() {
            @Override
            public void sayMessage(String message) {
                System.out.println("hello "+message);
            }
        };
        greetService1.sayMessage("咖啡");
        //不用括号
        GreetingService greetingService = message -> System.out.println("hello " + message);
        greetingService.sayMessage("大锤");
        //用括号
        GreetingService greetService2 = (message) -> System.out.println("hello " + message);
        greetService2.sayMessage("春江");

    }

    interface GreetingService {
        void sayMessage(String message);
    }

    interface MathOperation {
        int operation(int a, int b);
    }

}

变量作用域

package main.java;

/**
 * lambda作用域
 * lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。
 */
public class LambdaScope {

    //不必声明为final
    private static String salutation = "Hello! ";
//    private final  static String salutation = "Hello! ";

    public static void main(String[] args) {

        GreetingService greetingService = message -> System.out.println(salutation + message);
        GreetingService greetingService1 = new GreetingService() {
            @Override
            public void sayMessage(String message) {
                salutation = salutation + "春江";
                System.out.println(salutation + message);
            }
        };
        greetingService1.sayMessage("大锤");
//        GreetingService greetingService = message -> salutation = salutation + message ;

        //在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。
//        String salutation = "";
//        GreetingService greetingService2 = salutation -> System.out.println(salutation+"111");

        salutation = salutation + "春江";
        greetingService.sayMessage("大锤");
    }

    interface GreetingService{
        void sayMessage(String message);
    }

}

在匿名类内可以修改,在lambda里面不能修改,加了final则两个都不能修改。我们也可以直接在 lambda 表达式中访问外层的局部变量。lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义),在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。

posted @ 2021-07-30 15:48  时间外的往事  阅读(24)  评论(0)    收藏  举报