Lombda
语法
() -> {}
- 左侧 :指定了 Lambda 表达式需要的所有参数
- 右侧 :指定了 Lambda 体,即 Lambda 表达式要执行的功能。
- 左右遇一括号省,左侧推断类型省,能省则省
需要“函数式接口”的支持
- 函数式接口:接口中只有一个抽象方法的接口,称为函数式接口。
- 可以使用注解
@FunctionalInterface
修饰 - 可以检查是否是函数式接口
格式
-
() -> System.out.println("Hello Lambda!");
无参数,无返回值 -
(x) -> System.out.println(x)
有一个参数,并且无返回值 -
x -> System.out.println(x)
若只有一个参数,小括号可以省略不写 -
Comparator<Integer> com = (x, y) -> { System.out.println("函数式接口"); return Integer.compare(x, y); }; //有两个以上的参数,有返回值,并且 Lambda 体中有多条语句
-
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写 -
(Integer x, Integer y) -> Integer.compare(x, y);
Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”
四大内置核心函数式接口
- 除四大函数式接口外,还有他们的子接口也都是
@FunctionalInterface
修饰的函数是接口 - 比如:
BiFunction<T, , U, R>
,BiConsumer<T, U>
Consumer
-
public interface Consumer<T> {}
消费型接口 -
方法:
void accept(T t);
Supplier
public interface Supplier<T> {}
供给型接口- 方法:
T get();
Function
public interface Function<T, R> {}
函数型接口- 方法:
R apply(T t);
Predicate
public interface Predicate<T> {}
断言型接口boolean test(T t);
lambda方法引用或构造器引用
- 若 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用
- (可以将方法引用理解为 Lambda 表达式的另外一种表现形式)
- 直接引用已有的方法可以更简洁方便的实现需求,而且不需要再设置参数
方法引用的三种方式
对象的引用 :: 实例方法名
类名 :: 静态方法名
类名 :: 实例方法名
注意:
- 方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致!
- 若Lambda 的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式: ClassName::MethodName
构造器引用
- 构造器的参数列表,需要与函数式接口中参数列表保持一致
类名 :: new
数组引用
类型[] :: new
比如还有集合引用类似上面