个人学习笔记,欢迎小伙伴多提意见
1.接口中默认方法修饰为普通方法(新增关键字default、static)
2.lambda表达式(重点)
3.函数式接口
4.方法与构造函数引用
5.Stream流接口(重点)
6.Optional
1.接口中默认方法修饰为普通方法(新增关键字default、static)
作用:解决由于添加公共逻辑,不需要像之前大量的子类重写方法,只需要在方法添加上关键字完成功能编写即可,不影响其他地方
default允许子类重写方法(一般不用,除非实现多个接口都有default方法或者该逻辑需要)。static不允许重写
子类实现的多个接口(两个以上)含有default方法,需要重写方法default,指定执行哪个父类的default方法
2.lambda表达式(重点)
作用:简化匿名内部类的调用
lambda使用依赖于函数式接口编程
第一行打印语句,一个参数时,可以省略(),方法体只有一行语句时,可以省略{}和return
3.函数式接口
定义:一个接口中的抽象方法只有一个,那么这个接口就是一个函数式接口
一般会使用注解@FunctionalInterface 标识此接口是一个函数式接口,不加也行
在接口上直接加上注解,如果这个接口是一个函数式接口则不报错,否则编译报错
使用lambda表达式的前提
4.方法引入
方法引入:实际上就是lambda表达式直接引入的方法。简化lambda写法
静态方法引入
实例对象方法引入
构造函数方法引入
对象方法引入
必须遵循的规范:引入的方法参数列表返回类型必须要和实现的函数式接口中的参数列表、返回值类型保持一致。
函数式接口
使用方法引入
结合lambda表达式能够使代码变得更精简
5.Stream流
穿行流、并行流(多线程情况)
功能:过滤、去重、排序、最大最小值、分页、根据同名key相加value
list.stream()
.collect(Collectors.groupingBy(UserEnity::getName, Collectors.summingInt(UserEnity::getAge)))
.forEach((name, ageSum) -> System.out.println(name + "的年龄之和为:" + ageSum));
中间操作可以链式编程,每个方法返回stream流
常用的中间操作
- filter(Predicate predicate):过滤符合条件的元素。
- map(Function mapper):将一个元素映射为另一个元素。
- flatMap(Function> mapper):将一个元素映射为一个 Stream 流。
- distinct():去除重复元素。
- sorted():对元素进行排序。
- peek(Consumer action):在中间流程中打印出流中的元素,用于调试。
- limit(long maxSize):限制返回的元素个数。
- skip(long n):跳过前 n 个元素。
- unordered():取消流的有序性,提升性能。
6.Optional
作用:有效地解决空指针异常(NullPointerException)问题
常用方法:
Optional.ofNullable(对象或者值)
- isPresent():判断Optional对象是否包含值;
- get():获取Optional对象中的值,如果对象为空,则抛出NoSuchElementException异常;
- orElse(T other):如果Optional对象中的值存在,则返回该值,否则返回other;
- orElseGet(Supplier other):如果Optional对象中的值存在,则返回该值,否则调用Supplier对象的get()方法返回other;
- orElseThrow(Supplier exceptionSupplier):如果Optional对象中的值存在,则返回该值,否则抛出由Supplier对象指定的异常;
- ifPresent(Consumer consumer):如果Optional对象中的值存在,则调用Consumer对象的accept()方法处理该值;
- map(Function mapper):如果Optional对象中的值存在,则返回Function对象处理后的值,否则返回空的Optional对象;
- flatMap(Function> mapper):如果Optional对象中的值存在,则返回Function对象处理后的Optional对象,否则返回空的Optional对象。