Java核心技术知识点笔记—lambda表达式
前言:多年以前,计算机还未问世,逻辑学家Alonzo Church想要形式化地表示能有效计算的数学函数。(奇怪的是,有些函数已经知道是存在的,但却没人知道该如何计算。)他使用了希腊字母lambda(λ)来标记参数。
1、lambda表达式:是一个代码块,以及必须传入代码的变量规范。
1.1、lambda表达式的形式:(参数)->{表达式}
(String first, String second) -> {
System.out.print(first.length() + second.length());
}
(1)括号中的参数就是表达式所需的参数,要注意的是,即使表达式没有参数,仍然需要提供括号,像无参方法一样。
() -> {System.out.print("Lambda"); }
(2)如果可以推导出参数的类型,则可以忽略其类型。
Comparator<String> comp = (first, second) -> first.length() - second.length();
(3)如果方法只有一个参数,且参数类型可以推导,那么可以连括号都省略。
ActionListener listener = event->System.out.print("Action");
(4)无需指定lambda表达式的返回类型,上下文总是会推导出lambda的返回类型。
2、函数式接口:对于只有一个抽象方法的接口,需要这种接口的对象时,可以提供一个lambda表达式。这种接口成为函数式接口(functional interface)。
常用函数式接口
函数式接口 | 参数类型 | 返回类型 | 抽象方法名 | 描述 | 其他方法 |
Runnable | 无 | void | run | 作为无参数或返回值的运行 | |
Supplier<T> | 无 | T | get | 提供一个T类型的值 | |
Consumer<T> | T | void | accept | 处理一个T类型的值 | andThen |
BiConsumer<T,U> | T,U | void | accept | 处理T和U类型的值 | andThen |
Function<T,R> | T | R | apply | 有一个T类型参数的函数 | compose,andThen,identity |
BiFunction<T,U,R> | T,U | R | apply | 有T和U类型参数的函数 | andThen |
UnaryOperator<T> | T | T | apply | 类型T上的一元操作符 | compose,andThen,identity |
BinaryOperator<T> | T,T | T | apply | 类型T上的二元操作符 | andThen,maxBy,minBy |
Predicate<T> | T | boolean | test | 布尔值函数 | and,or,negate,isEqual |
BiPredicate<T,U> | T,U | boolean | test | 有两个参数的布尔值函数 | and,or,negate |