一、lambda 表达式
-
lambda 操作符 -> 符号的左边写传入的参数,右边则是函数式接口的实现方法。
-
函数式接口:只有一个实现方法的接口,可以添加 @FunctionalInterface 注解。
-
-
lambda 的语法:
-
无参数:() -> 运算式;
-
有参数:(e) -> 对 e 的运算式;
-
多参数:(e,f) -> 对 e f 的运算式;
-
有返回值:接口返回类型 = (e,f) -> 对 e f 的运算式;
-
关于参数的类型:不需要指定,java会根据上下文进行类型推断,如果非要加,请全部加上类型。
-
-
java提供了 四大内置函数式接口:
-
消费型接口(无返回值):Consumer<T>
-
void accept( T t );
-
-
供给型接口(无参数,有返回):Supplier<T>
-
T get();
-
-
函数型接口(有参数,也有返回):Function<T,R>
-
R apply( T t );
-
-
断言型接口(对参数做判断):Predicate<T>
-
boolean test(T t);
-
-
-
java还提供了四大内置函数接口的拓展接口。
二、方法引用
-
若lambda 体中的内容有方法已经实现了,就可以通过使用“方法引用”(可以理解为方法引用就是 Lambda 表达式的另一种表现形式)
-
方法引用的语法格式:
-
对象::实例方法名
-
抽象方法的参数、返回值类型和实现方法的参数、返回值类型相同
-
-
类::静态方法名
-
类::实例方法名
-
第一参数是方法的调用者,第二个参数是方法的参数
-
-
三、构造器的引用
-
格式:calssname :: new
-
需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表保持一致。
-
-
数组的引用: Type[] :: new;
四、Stream API
-
主要流程:
-
创建 Stream 流
-
通过collection 提供的 stream() 或 parallelStream()
-
通过Arrays 中的静态 stream() 方法 获取数组流
-
通过 Stream 中的静态方法 of()
-
创建一个无限流(迭代流)
-
Stream.iterate(0,(x) -> x + 2)
-
-
-
中间操作
-
筛选、过滤
-
filter — 接收 Lambda ,从流中排除默写元素。定义一个筛选规则。
-
limit — 截断流,对流的长度进行操作。
-
skip(n) — 跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足 n 个,则返回一个空流。与 limit 是互补的。
-
也就是说,limit 选取的是前面几个流,而 skip 则是选取的 n 个元素之后的流,没有了,就是一个空流。
-
-
distinct — 筛选,通过流所生成元素的 hashcode() 和 equals() 去除重复元素,注意:对象中的 hashcode() 和 equals() 方法默认是调用系统的,如果要定义自己的规则需要重写。
-
-
映照
-
map — 接收 Lambda ,将元素转换成其他形式或提取信息。接收一个函数作为参数,该函数将会被应用在每一个元素上,并将其映射成一个新的元素。
-
简单说:就是定义一个规则,这个规则将会逐个应用在流中的每一个元素上。这个规则可以是一个 Lambda 表达式,也可以是一个函数方法,总之是一个拥有返回值得东西。
-
-
flatMap — 接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。
-
可以类比 集合中的 add() / addAll() 方法的区别
-
-
-
排序
-
sorted — 自然排序(Comparable)
-
sorted(Comparator com) — 定制排序(Comparator )
-
-
注意:中间操作都是对前一个流进行下一步操作,基础流是前一个的返回流。
-
-
结束操作
-
查找、匹配
-
allMatch — 检查是否匹配所有元素
-
所有元素是否都符合指定的规则
-
-
anyMatch — 检查是否至少匹配一个元素
-
至少有一个元素符合规则
-
-
noneMatch — 检查是否没有匹配所有元素
-
没有一个元素符合规则
-
-
findFirst — 返回第一个元素
-
Optional<> 对象 可用于排除一个空指针 op.other() 方法
-
-
findAny — 返回当前流中的任意元素
-
查找符合条件的任意一个,如果是 stream() 方法 则只会有一种结果,这个是串行流,如果是 parallelStream() 方法,则会是一个并行流,结果就不一定了,参照比重进行随机。
-
-
count — 返回流中元素的总个数
-
返回一个 Long 类型
-
-
max — 返回元素中的最大值
-
通过规则返回一个流中最大值,返回值为 Optional<> 类型
-
-
min — 返回流中的最小值
-
-
规约
-
reduce(T identity,BinaryOperator )— 可以将流中元素反复结合起来,得到一个值。
-
如果是这种模式下将会的到一个确切类型的返回值。BinaryOperator 是一个二元操作方法,对传入的两个参数进行操作之后返回一个值。这里可以通过 Lambda 进行实现。
-
-
reduce(BinaryOperator)
-
这个模式下,有可能得到一个空值,所以返回一个 Optional<> 类型的值。
-
-
-
收集
-
collect — 将流转换为其他形式。接受一个Collector接口的实现,用于给Stream中元素做汇总的方法。
-
如果收集的结果是一个集合,可以通过 Collectors 中的静态方法进行实现。
-
-
-
-
五、对于空指针问题的处理
-
提供一个 Optional<> 类型用于接收可能 空指针 的返回值