Lambda 表达式
- 一般格式:
| 1 | (参数列表)->{方法体} | 
- 作用:相当于一个匿名函数,可用于函数参数传递等
- 注意事项:
- 若参数列表只有一个参数,那么()可省略
- 参数列表中的参数类型一般可省略不写,编译器能够依据上下文进行推断
- 若方法体只有一句话,那么{}可省略
 
- 若参数列表只有一个参数,那么
函数式接口
什么是函数式接口?
- 仅有一个方法的接口,叫做函数式接口
四大内置函数接口
Consumer
- 抽象方法
| 1 | void accept(T t); | 
对一个类型为T的参数t执行相应的操作,无返回值(与Fuction函数接口区别)。
Supplier
- 抽象方法
| 1 | T get(); | 
返回一个类型为T的对象。
Function
- 抽象方法
| 1 | R apply(T t); | 
对一个类型为T的参数t执行相应的操作,返回类型为R的对象(与Consumer函数接口区别)。
Predicate
- 抽象方法
| 1 | boolean test(T t); | 
对一个类型为T的参数t执行判断,返回boolean类型变量。
应用
比如可以将上述函数式接口作为方法(函数)的参数,抽象实现功能方法;再结合Lambda表达式完成具体方法。
方法引用与构造器引用
方法引用
- 一般格式:
- 类::静态方法名
- 实例::实例方法名
- 类::实例方法名- 当Lambda表达式参数列表的第一个参数是实例方法的调用者,第二个是实例方法的参数,可使用该写法。
 
 
构造器引用
- 一般格式
- 类名::new
 
- 注意
- 具体调用哪一个构造函数,应与Lambda表达式结合Java代码上下文推断确定
 
Stream API
创建流
- 有限流
| 1 | 集合.stream();//获取集合流 | 
- 无限流
| 1 | stream.generate(Supplier接口); | 
- 并行流
| 1 | 集合.parallelStream(); | 
P.S.并行流底层实现的原理是ForkJoinPool并行处理框架
中间操作
筛选与切片
- filter
| 1 | 流.filter(Predicate接口); | 
按照Predicate接口中的判断情况过滤数据流中的元素。
- limit
| 1 | 流.limit(n); | 
取数据流中的前n项数据。
- skip
| 1 | 流.skip(n); | 
跳过数据流中的n个元素。
- distinct
| 1 | 流.distinct(n); | 
依据数据流中数据的hashCode()以及equals()判重,去除重复元素。
映射
- map
| 1 | 流.map(Function接口); | 
将数据流中的的数据按照Function接口的规则,映射到新的流。
- flatMap
| 1 | 流.flatMap(Function接口); | 
与map类似,但是把所有得到的流连接成一个流。
排序
- sorted 1 
 2流.sorted();// 自然排序(依据类中对Comparable接口的compareTo的实现排序) 
 流.sorted(Comparator);// 指定排序
按照排序规则排序数据流。
终止操作
查找与匹配
| 方法名 | 参数说明 | 返回值 | 功能 | 
|---|---|---|---|
| allMatch | Predicate接口 | 布尔 | 是否匹配所有元素 | 
| anyMatch | Predicate接口 | 布尔 | 是否至少匹配一个 | 
| noneMatch | Predicate接口 | 布尔 | 是否没有匹配 | 
| findFirst | 无 | Optional<T> | 返回第一个元素 | 
| findAny | 无 | Optional<T> | 返回任意元素 | 
| count | 无 | Long | 返回个数 | 
| max | Comparator | Optional<T> | 返回最大值 | 
| min | Comparator | Optional<T> | 返回最小值 | 
规约与收集
- reduce
| 1 | 流.reduce(初始值, BinaryOperator); | 
按照BinaryOperator接口实现,对流中的数据进行汇总运算。
- collect
常见用法如下:
- 转换为其他集合
- 转换为通用集合
- 流.collect(Collectors.to集合)
 
- 转换为指定集合
- 流.collect(Collectors.toCollection(XXX集合::new))
 
 
- 转换为通用集合
- 分组(按照某一值,注意与分区区别)
- 单级分组
- 流.collect(Collectors.groupingBy(Function接口))
 
- 多级分组
- 流.collect(Collectors.groupingBy(Function接口,Collectors.groupingBy(Function接口)))
 
 
- 单级分组
- 分区(按照某一判断条件,注意与分组区别)
- 流.collect(Collectors.partitioningBy(Predicate接口))按照Predicate接口规则进行分区
 
- 聚集函数运算
- 流.collect(Collectors.聚集函数),其中常见聚集函数如下:- counting
- averaging
- summming
- maxBy
- minBy
 
- 流.collect(Collectors.summarizing)获取汇总数据,可通过这个对象的方法获取最大、最小、平均值等参数
- 流.collect(Collectors.joining)对字符串进行连接操作(类似- String.join)
 
Optional 类
作用
用于封装对象,可减少空指针异常。
常见方法
| 方法 | 含义 | 
|---|---|
| Optional.of(T t) | 创建Optional对象 | 
| Optional.empty() | 创建空的Optional对象 | 
| Optional.ofNullable(T t) | 若t为空则创建空的Optional对象;否则依据t创建Optional对象 | 
| isPresent() | 判断是否包含值 | 
| Optional.orElse(T t) | 返回Optional包裹的对象;或者当该对象为空时,返回默认值t | 
| Optional.orElseGet(Supplier s) | 返回Optional包裹的对象;或者当该对象为空时,按照Supplier接口生成默认值返回 | 
| Optional.map(Function f) | 返回按照f处理后的Optional对象;或者当Optional对象为空时,返回Optional.empty() | 
| Optional.flatMap(Function f) | 与map类似,但是返回值类型有区别 | 
接口默认方法与静态方法
接口默认方法
- 接口中可编写默认方法,用 default关键字标识。
注意事项:
- “类优先”:若父类有与父接口默认方法同名的方法,子类继承后默认调用父类中的实现。
- “接口覆写”:若父接口中包含多个同名的默认方法,子类实现时需要自行指定实现。
接口静态方法
- 接口中可编写静态方法,与类相似。