一、Lambda详解
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
1、Lambda表达式的基础语法
方法签名 -> 方法体
示例:
()->{}
左侧:lambda的表达式参数列表
右侧:lambda表达式中需要执行的功能,即 Lambda体
2、Lambda语法格式
语法格式1:无参数,无返回值
() -> System.out.println("hello,lambda!");
语法格式2:有一个参数,无返回值
(x) -> System.out.println(x);
语法格式3:有一个参数,方法签名可以省略括号
x -> System.out.println(x);
语法格式4:有两个以上的参数,有返回值,并且lambda体中有多条语句
Comparator<Interger> com = (x,y)->{
System.out.println("函数式接口");
return Integer.compare(x,y);
};
语法格式5:若lambda只有一条语句,return和大括号可以省略不写
Comparator<Integer> com = (x,y) -> Integer.compare(x,y);
语法格式6:Lambda表达式的参数列表的数据类型可以忽略不写,jvm可以通过编译器推断出上下文,数据类型,即"类型推断"
(Integer x,Integer y) -> Integer.compare(x,y);
总结:
上联:左右遇一括号省
下联:左侧推断类型省
横批:能省则省
3、Lambda表达式需要函数式接口的支持
函数式接口是用来完成Lambda表达式映射成JAVA对象的一种接口,确切的说把接口中仅存的一个抽象方法和Lambda表达式绑定并完成对象的实例化。
函数式接口:接口中只有一个抽象方法的接口,称为函数式接口。
函数式接口使用 @FunctionlInterface 注解修饰
4、Java8内置了四大核心函数式接口
消费型接口
Consumer<T> void accept(T t);
供给型接口
Supplier<T> T get();
函数型接口
Function<T,R> R apply(T t);
断言型接口
Predicate<T> test(T t);
二、方法引用
如果Lambda表达式的代码块只有一条代码,还可以在代码块中使用方法引用和构造器引用。
若 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用(可以将方法引用理解为 Lambda 表达式的另一种表现形式)
1、对象的引用 :: 实例方法名
2、类名 :: 静态方法名
3、类名 :: 实例方法名
注意:
1、方法引用所引用的方法参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回类型保持一致
2、若lambda的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式:ClassName:MethodName
三、构造器引用:构造器的参数列表,需要与函数式接口中的参数列表保持一致!
1、 类名 :: new
四、数组引用
1、类型[] :: new
不管那种引用,都要遵循Lambda表达式的代码块执行的方法的入参和lambda的形参完全一致!