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);