目录
一、Lambda表达式
二、Lambda表达式与函数式接口
三、方法引用(java8新特性)
一、Lambda表达式
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中),简化代码。
1、基础语法
()->{}, 即lambda参数列表 -> lambda要实现的功能(lambda体)。
(1)无参无返回值
- () -> System.out.println("hello,lambda!");
- Runnable task = () -> System.out.println("i am coming...");
(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);
二、Lambda表达式与函数式接口
- 函数式接口:只有1个抽象方法的接口,用@FunctionalInterface修饰。
- 函数式接口好处:使用极简的lambda表达式 实例化函数式接口
- lambda表达式仅仅适用于函数式接口!!!
例:编写一个实现函数式接口Comparator的java类,封装排序逻辑
//实现接口,重写方法
Collections.sort(list, new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
return Integer.compare(o1.getAge(), o2.getAge());
}
});
//使用lambda表达式 实例化函数式接口
Comparator<User> sortAsc =
(p1, p2) -> Integer.compare(p1.getAge(), p2.getAge());
Collections.sort(list, sortAsc);
三、方法引用(java8新特性)
1、场景
有时,用lambda表达式仅仅是调用一些已经存在的方法,除了调用动作外,没有其他任何多余的动作——此种场景,通过方法名调用。
2、方法引用分类
(1)静态方法的引用 类名::静态方法名
(2)实例方法引用 对象::实例方法名
调用已经存在的实例的方法,与静态方法引用不同的是类要先实例化,静态方法引用类无需实例化,直接类名调用。
(3)对象方法引用 类名::实例方法名
lambda表达式参数列表第1个参数是实例方法第参数调用者,第2个参数是实例方法的参数,则使用 对象方法引用。
(4)构造方法引用 类名::new
注:构造器参数列表 同 函数式接口中抽象方法的参数列表