语雀版:https://www.yuque.com/g/mingrun/embiys/eabrg26xsx4x8u4k/collaborator/join?token=TU6BLu8LBQxL8czK&source=doc_collaborator# 《lambda&stream深入剖析》
基础概念
- lambda在编程中的叫法是匿名函数(Anonymous Function),匿名函数(英语:Anonymous Function)在计算机编程中是指一类无需定义标识符(函数名)的函数或子程序。
Lambda 在编程语言中往往是一个匿名函数,也就是说Lambda 是一个抽象概念,而编程语言提供了配套支持,比如在 Java 中其实为Lambda 进行配套的就是函数式接口,通过函数式接口生成匿名类和方法进行Lambda 式的处理。 - Lambda所能提供的优点 在java中则由函数式接口所提供,函数式接口提供了一些通用性的能力,这些接口在sdk中有一套完整的实现,或者说是最佳实践,这就是stream流
- 句法
() -> System.out.println("零参数 lambda");
p -> System.out.println("一个参数:" + p);
(p1 [,p2,p3,....pn]) -> System.out.println("多个参数:" + p1 + ", " + p2 + ... + pn);
(parameter1, parameter2) -> { code block [return] }
- 方法引用
//静态方法
Consumer<String> c = [ (s) -> System.out.println(s); <=> System.out::println; ]
//实例方法
List<String> list = Lists.newArrayList();
Consumer<String> c = [ (e) -> list.add(e); <=> list::add; ]
//构造器 :: new
Supplier<List<String>> s = [ () -> new ArrayList<>(); <=> ArrayList::new; ]
原生函数式接口
@FunctionalInterface注解
有且只有一个抽象方法的接口被称为函数式接口,函数式接口适用于函数式编程的场景,Lambda就是Java中函数式编程的体现,可以使用Lambda表达式创建一个函数式接口的对象,一定要确保接口中有且只有一个抽象方法,这样Lambda才能顺利的进行推导。
与@Override 注解的作用形似,Java 8中专门为函数式接口引入了一个新的注解:@FunctionalInterface 。
该注解可用于一个接口的定义上,一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法(equal和hashcode方法不算),否则将会报错。但是这个注解不是必须的,只要符合函数式接口的定义,那么这个接口就是函数式接口。
- Consumer<T>: 消费性接口:
-
- 消费(1..n 入参, 无返回)
- 应用:
list.foreach(System.out::println); //打印数组
- Supplier<T>: 供给型接口
-
- 获取(无入参,有返回)
- 通过泛型 T 定义了一个返回值类型,但是没有入参,它代表你可以针对调用方获取某个值,比较典型的例子是 Stream 中的 collect 方法,通过自定义传入我们想要取得的某种对象进行对象收集。
List<String> list = Stream.of("a", "b", "c").collect(Collectors.toList());