Java-Lambda表达式详解

Lambda表达式的含义

Lambda表达式基于数学中的 λ 演算得名,是一个匿名函数(有没有想起匿名内部类),即没有函数名的函数。在Java 中,无需实现接口即可使用接口中的方法

例如抽象方法:
 *      public abstract int sum(int a, int b);
 *      翻译成为 Lambda:
 *      (int a, int b) -> { return a + b; }

从上面的例子不难发现左边 (int a, int b)代表的是参数,右边 { return a + b; }代表的是方法体,说两种特殊情况
(1)没有参数, () -> { return … } (这里的return是可以省略的)
(2)没有返回值 ()-> { … },(int a, int b)-> { a+b }

Lambda 表达式的前提

Java当中使用 Lambda 表达式的前提是:必须有“函数式接口”。(概念:有且仅有一个抽象方法的接口,叫做函数式接口。)
如何才能万无一失地检测一下当前接口是不是函数式接口呢?方法上面有这个注解(@FunctionalInterface)就是函数式接口,Java8中新增的函数式接口都在java.util.function包下。

@FunctionalInterface
public interface 函数式接口名 {
  // ...
}

Lambda 表达式的语法

现在我们来定义一个函数式接口,函数式接口被用作了一个参数(常用的使用形式),这个参数在使用的时候就实现了自己的抽象方法,在函数被调用的时候直接使用了它实现的抽象方法

@FunctionalInterface
public interface CustomInter {
   	public abstract int print(int m);
}

public static void method(CustomInter customInter) {
   	System.out.println(customInter.print(10));
}

1、Lambda体是一条语句,通过方法的参数类型来确定是哪个函数式接口。

// Java8之前:
CustomInter customInter = new CustomInter(){
    @Override
    public int print(int m) {
        return 0;
    }
};
method(customInter);
// Java8方式:
method((int a) -> { return a; });

// 在来一个很常见的
// Java8之前:
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("hello world");
    }
}).start();
// Java8方式:
new Thread(() -> System.out.println("hello world")).start();

2、在 Lambda 表达式当中,凡是可以推导的,都是可以省略的

    1)Lambda 表达式当中的参数类型可以省略不写。
    2)如果参数有且仅有一个,那么小括号可以省略。
    3)如果语句只有一个,那么大括号、分号和 return 也可以省略
// 标准格式
method((int x) -> { return ++x; });
// 省略参数类型
method((x) -> { return ++x; });
// 省略参数小括号
method(x -> { return ++x; });
// 省略大括号和 return 关键字
method(x -> ++x);

你可能感兴趣的:(Java-基础,java,开发语言)