【java函数式编程02】lambda表达式与双冒号

java lambda表达式

0 总结在前面:

  1. lambda表达式是java函数式编程范式的一个表现形式,将单方法类或接口的实现,直接看成一个可直接定义的函数方法,以更紧凑简洁形式,提高可读性,减少代码量;
  2. Lambda表达式允许您更紧凑地表达单方法类的实例。(这是官方文档的翻译说明);
  3. 双冒号作用:当lambda表达式内部的实现是单方法类且与实现接口入参形式相同,使用双冒号:【类名(类实例名) :: 方法名】,可以进一步简化相关表达;

1 什么是Lambda表达式?

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

Lambda表达式使您可以执行此操作,将功能视为方法参数,或将代码视为数据。

Lambda expressions let you express instances of single-method classes more compactly. Lambda表达式允许您更紧凑地表达单方法类的实例。

2why?

  • 提高可读性;
  • 减少代码量,更加简洁节凑;

3 语法?

  • A comma-separated list of formal parameters enclosed in parentheses.一个圆括号内以逗号分离的参数列表;
  • The arrow token, ->箭头标记
  • A body, which consists of a single expression or a statement block.一个主体,由单个表达式或语句块组成。
  • 如果指定单个表达式,则Java运行时将计算表达式,然后返回其值。或者,您可以使用return语句。
  • 如果lambda表达式的目标类型及其捕获的参数是可序列化的,则可以序列化它。但是,与内部类一样,强烈建议不要对lambda表达式进行序列化。

4 how?

package consumer;
public class Java8LambdaTest {
    public static void main(String args[]){
        Java8LambdaTest tester = new Java8LambdaTest();
        MathOperation multiplicationAndAddx = (x, y) -> {return x * y + x;};

        // 类型声明
        MathOperation addition = (int a, int b) -> a + b;

        // 不用类型声明
        MathOperation subtraction = (a, b) -> a - b;

        // 大括号中的返回语句
        MathOperation multiplication = (int a, int b) -> { return a * b; };

        // 没有大括号及返回语句
        MathOperation division = (int a, int b) -> a / b;

        System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
        System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
        System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
        System.out.println("10 / 5 = " + tester.operate(10, 5, division));
        System.out.println("10 * 5 + 10 = " + tester.operate(10, 5, multiplicationAndAddx));


        // 不用括号
        GreetingService greetService1 = message ->
                System.out.println("Hello " + message);

        // 用括号
        GreetingService greetService2 = (message) ->
                System.out.println("Hello " + message);

        greetService1.sayMessage("Runoob");
        greetService2.sayMessage("Google");
    }

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

    interface GreetingService {
        void sayMessage(String message);
    }

    private int operate(int a, int b, MathOperation mathOperation){
        return mathOperation.operation(a, b);
    }
}

5 总结

  1. callable和runnable的lambda接口由于只有一个方法,即run和call,都不含有入参,所有lambada 表达式也没有入参,除非自己定义入参,但是call支持返回,也是其特性;
  2. lambda表达式适用于单方法类,也就是单方法接口实现

6 双冒号作用:

双冒号是lambda表达式的一种简化形式,当lambda表达式实现函数与其他静态类或者实现类的方法有相同个数或形式入参的时候,可以简化表达,使用

类名(类实例名) :: 方法名

可以简化表达式;相当于对这个方法闭包的引用;

猜你喜欢

转载自blog.csdn.net/xinquanv1/article/details/84572542