Lambda表达式和方法的引用
Lambda表达式
一.Lambda表达式:
1.Lambda表达式是 Java8 中最重要的新功能之一。使用 Lambda 表达式可以替代只有一个抽象函数的接口实现,告别匿名内部类,代码看起来更简洁易懂。Lambda表达式同时还提升了对集合、框架的迭代、遍历、过滤数据的操作。
2.Lambda表达式是对象,是一个函数式接口的实例.
二.Lambda表达式特点:
1:函数式编程
2:参数类型自动推断
3:代码量少,简洁
三.Lambda表达式示例
四.Lambda表达式好处:
1:更简洁的代码
2:更容易的并行
五.Lambda表达式使用场景:
任何有函数式接口的地方.
5.1函数式接口:只有一个抽象方法(Object类中的方法除外)的接口是函数式接口.
5.2函数式接口
Supplier 代表一个输出
Consumer 代表一个输入
BiConsumer 代表两个输入
Function 代表一个输入,一个输出(一般输入和输出是不同类型的)
UnaryOperator 代表一个输入,一个输出(输入和输出是相同类型的)
BiFunction 代表两个输入,一个输出(一般输入和输出是不同类型的)
BinaryOperator 代表两个输入,一个输出(输入和输出是相同类型的)
五.Lambda表达式语法
args -> expr 或者 (Object… args) -> {函数式接口抽象方法实现逻辑}
()里面参数的个数,根据函数式接口里面抽象方法的参数个数来决定。
当只有一个参数的时候,()可以省略 当expr逻辑非常简单的时候,{}和return可以省略
六.注意事项
1.不需要也不允许使用throws语句来声明它可能会抛出的异常
2.看参数,看返回值.
方法的引用
一.方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法,方法引用提供了一种引用而不执行方法的方式,如果抽象方法的实现恰好可以使用调用另外一个方法来实现,就有可能可以使用方法引用
二.方法的引用分类:
类型 |
语法 |
对应的lambda表达式 |
静态方法引用 |
类名::staticMethod |
(args) -> 类名.staticMethod(args) |
实例方法引用 |
inst::instMethod |
(args) -> inst.instMethod(args) |
对象方法引用 |
类名::instMethod |
(inst,args) ->类名.instMethod(args) |
构造方法引用 |
类名::new |
(args) -> new 类名(args) |
三.静态方法引用:
如果函数式接口的实现恰好可以通过调用一个静态方法来实现,那么就可以使用静态方法引用.
四.实例方法引用:
如果函数式接口的实现恰好可以通过调用一个实例的实例方法来实现,那么就可以使用实例方法引用.
五.对象方法引用:
抽象方法的第一个参数类型刚好是实例方法的类型,抽象方法剩余的参数恰好可以当做实例方法的参数。如果函数式接口的实现能由上面说的实例方法调用来实现的话,那么就可以使用对象方法引用.
六.构造方法引用:
如果函数式接口的实现恰好可以通过调用一个类的构造方法来实现,那么就可以使用构造方法引用
Stream
一.Stream API:
Stream是一组用来处理数组、集合的API.
二.Stream特性:
1:不是数据结构,没有内部存储
2:不支持索引访问
3:延迟计算
4:支持并行
5:很容易生成数组或集合(List,Set)
6:支持过滤,查找,转换,汇总,聚合等操作
三.Stream运行机制:
Stream分为 源source,中间操作,终止操作 流的源可以是一个数组、一个集合、一个生成器方法,一个I/O通道等等。
一个流可以有零个和或者多个中间操作,每一个中间操作都会返回一个新的流,供下一个操作使用。
一个流只会有一个终止操作 Stream只有遇到终止操作,它的源才开始执行遍历操作
四.Stream常用API:
4.1中间操作:
过滤 filter
去重 distinct
排序 sorted
截取 limit、skip
转换 map/flatMap
其他 peek
4.2终止操作
循环 forEach
计算 min、max、count、 average
匹配 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny
汇聚 reduce
收集器 toArray collect
四.Stream的创建
1、通过数组
2、通过集合来
3、通过Stream.generate方法来创建
4、通过Stream.iterate方法来创建
5、其他API创建