Lambda表达式
介绍
Lambda表达式是一种没有名字的函数,也可称为闭包,是Java 8 发布的最重要新特性。
本质上是一段匿名内部类,也可以是一段可以传递的代码。
还有叫箭头函数的…
所谓闭包,就是能够读取其他函数内部变量的函数,比如在java中,方法内部的局部变量只能在方法内部使用,所以闭包可以理解为定义在一个函数内部的函数
闭包的本质就是将函数内部和函数外部链接起来的桥梁
特点
允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
和匿名内部类对比
public class Lambda_01 {
public static void main(String[] args) {
Integer[] arr = {
1, 6, 8, 2, 0, 7, 9, 55 };
// asList:把数组转换为List集合
List<Integer> integers = Arrays.asList(arr);
// 匿名内部类写法
Collections.sort(integers, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
return o2 - o1;
}
});
System.out.println(integers);
// Lambda
Collections.sort(integers, (i1, i2) -> i1 - i2);
System.out.println(integers);
}
}
应用场景
列表迭代
Map映射
Reduce聚合
代替一个不想命名的函数或是类,该函数或类往往并不复杂。
想尽量缩短代码量的各个场景均可以
代码实现
具体语法
-
(parameters) -> expression
-
(parameters) ->{ statements; }
语法特点
可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值
如果只有一条语句,并且是返回值语句,就可以不写return 不写 {}
如果写上{} 就必须写return 和 ;
如果有多条语句,必须写{} return 和 ; 也必须写
简单案例
-
不需要参数,返回值为 5
() -> 5 -
接收一个参数(数字类型),返回其2倍的值
x -> 2*x -
接受2个参数(数字),并返回他们的差值
(x, y) -> x – y -
接收2个int型整数,返回他们的和
(int x, int y) -> x + y -
接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)
函数式接口
介绍
英文称为Functional Interface
其本质是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
核心目标是为了给Lambda表达式的使用提供更好的支持,进一步达到函数式编程的目标,可通过运用函数式编程极大地提高编程效率。
其可以被隐式转换为 lambda 表达式。
特点
函数式接口是仅制定一个抽象方法的接口
可以包含一个或多个静态或默认方法
专用注解即@FunctionalInterface 检查它是否是一个函数式接口,也可不添加该注解
如果有两个或以上 抽象方法,就不能当成函数式接口去使用,也不能添加@FunctionalInterface这个注解
如果只有一个抽象方法,那么@FunctionalInterface注解 加不加 都可以当做函数式接口去使用
回调函数
简单来说就是回调函数,方法的参数是一个方法,在这个方法中对传递的方法进行调用
应用场景
想通过函数式编程,提高编程效率的各种场景均可。
代码实现
无参情况
有参情况
JDK自带常用的函数式接口
Supplier 接口
Supplier接口 代表结果供应商,所以有返回值,可以获取数据
有一个get方法,用于获取数据
Consumer 接口
Consumer接口 消费者接口所以不需要返回值
有一个accept(T)方法,用于执行消费操作,可以对给定的参数T 做任意操作
Function 接口
Function<T,R>接口 表示接收一个参数并产生结果的函数
顾名思义,是函数操作的
有一个R apply(T)方法,Function中没有具体的操作,具体的操作需要我们去为它指定,因此apply具体返回的结果取决于传入的lambda表达式
Predicate 接口
Predicate接口 断言接口
就是做一些判断,返回值为boolean
有一个boolean test(T)方法,用于校验传入数据是否符合判断条件,返回boolean类型
方法引用和构造器调用
概念说明
Lambda表达式的另外一种表现形式,提高方法复用率和灵活性。
特点
更简单、代码量更少、复用性、扩展性更高。
应用场景
若Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用。
不需要再复写已有API的Lambda的实现。
代码实现
方法引用
对象的引用::实例方法名
public class FunCall_01 {
public static void main(String[] args) {
Integer i1 = 10;
// 方法调用
String str = i1.toString();
System.out.println(str);
// lambda表达式写法
Supplier<String> su = () -> i1.toString();
System.out.println(su.get());
// 方法引用写法
Supplier<String> su1 = i1::toString;
System.out