流式编程2-处理流和终端处理

一.中间操作

1.跟踪调试 peek
2.流元素排序 sort
3.移除元素

3.1 distinct():在 Randoms.java 类中的 distinct() 可用于消除流中的重复元素。相比创建一个 Set 集合,该方法的工作量要少得多。
3.2 filter(Predicate):过滤操作会保留与传递进去的过滤器函数计算结果为 true 元素。

4.应用到函数操作

4.1 map(Function):将函数操作应用在输入流的元素中,并将返回值传递到输出流中
4.2 mapToInt(ToIntFunction):操作同上,但结果是 IntStream。
4.3 mapToLong(ToLongFunction):操作同上,但结果是 LongStream。
4.4 mapToDouble(ToDoubleFunction):操作同上,但结果是 DoubleStream。

5.在 map() 中组合流

假设我们现在有了一个传入的元素流,并且打算对流元素使用 map() 函数。现在你已经找到了一些可爱并独一无二的函数功能,但是问题来了:这个函数功能是产生一个流。我们想要产生一个元素流,而实际却产生了一个元素流的流。
flatMap() 做了两件事:将产生流的函数应用在每个元素上(与 map() 所做的相同),然后将每个流都扁平化为元素,因而最终产生的仅仅是元素。
a:flatMap(Function):当 Function 产生流时使用。
b:flatMapToInt(Function):当 Function 产生 IntStream 时使用。
c:flatMapToLong(Function):当 Function 产生 LongStream 时使用。
d:flatMapToDouble(Function):当 Function 产生 DoubleStream 时使用。

  1. IntStream.concat() 组合流数据

二.Optional类

a.findFirst() 返回一个包含第一个元素的 Optional 对象,如果流为空则返回 Optional.empty
b.findAny() 返回包含任意元素的 Optional 对象,如果流为空则返回 Optional.empty
c.max() 和 min() 返回一个包含最大值或者最小值的 Optional 对象,如果流为空则返回 Optional.empty
d.reduce() 不再以 identity 形式开头,而是将其返回值包装在 Optional 中。(identity 对象成为其他形式的 reduce() 的默认结果,因此不存在空结果的风险)
e.对于数字流 IntStream、LongStream 和 DoubleStream,average() 会将结果包装在 Optional 以防止流为空。
f.Reduce中文含义为:减少、缩小;而Stream中的Reduce方法干的正是这样的活:根据一定的规则将Stream中的元素进行计算后返回一个唯一的值。

1.便利函数

ifPresent(Consumer):当值存在时调用 Consumer,否则什么也不做。
orElse(otherObject):如果值存在则直接返回,否则生成 otherObject。
orElseGet(Supplier):如果值存在则直接返回,否则使用 Supplier 函数生成一个可替代对象。
orElseThrow(Supplier):如果值存在直接返回,否则使用 Supplier 函数生成一个异常。

2.创建 Optional

empty():生成一个空 Optional。
of(value):将一个非空值包装到 Optional 里。
ofNullable(value):针对一个可能为空的值,为空时自动生成 Optional.empty,否则将值包装在 Optional 中。

3.Optional 对象操作

filter(Predicate):将 Predicate 应用于 Optional 中的内容并返回结果。当 Optional 不满足 Predicate 时返回空。如果 Optional 为空,则直接返回。
map(Function):如果 Optional 不为空,应用 Function 于 Optional 中的内容,并返回结果。否则直接返回 Optional.empty。
flatMap(Function):同 map(),但是提供的映射函数将结果包装在 Optional 对象中,因此 flatMap() 不会在最后进行任何包装。

4.Optional 流

假设你的生成器可能产生 null 值,那么当用它来创建流时,你会自然地想到用 Optional 来包装元素。如下是它的样子

三:终端操作

1.数组

toArray():将流转换成适当类型的数组。
toArray(generator):在特殊情况下,生成自定义类型的数组。

2.循环

forEach(Consumer)常见如 System.out::println 作为 Consumer 函数。
forEachOrdered(Consumer): 保证 forEach 按照原始流顺序操作。
第一种形式:无序操作,仅在引入并行流时才有意义。在 并发编程 章节之前我们不会深入研究这个问题。这里简单介绍下 parallel():可实现多处理器并行操作。实现原理为将流分割为多个(通常数目为 CPU 核心数)并在不同处理器上分别执行操作。因为我们采用的是内部迭代,而不是外部迭代,所以这是可能实现的。

3.集合

collect(Collector):使用 Collector 收集流元素到结果集合中。
collect(Supplier, BiConsumer, BiConsumer):同上,第一个参数 Supplier 创建了一个新结果集合,第二个参数 BiConsumer 将下一个元素包含到结果中,第三个参数 BiConsumer 用于将两个值组合起来。

4.组合

reduce(BinaryOperator):使用 BinaryOperator 来组合所有流中的元素。因为流可能为空,其返回值为 Optional。
reduce(identity, BinaryOperator):功能同上,但是使用 identity 作为其组合的初始值。因此如果流为空,identity 就是结果。
reduce(identity, BiFunction, BinaryOperator):更复杂的使用形式(暂不介绍),这里把它包含在内,因为它可以提高效率。通常,我们可以显式地组合 map() 和 reduce() 来更简单的表达它。

5.匹配

allMatch(Predicate) :如果流的每个元素根据提供的 Predicate 都返回 true 时,结果返回为 true。在第一个 false 时,则停止执行计算。
anyMatch(Predicate):如果流中的任意一个元素根据提供的 Predicate 返回 true 时,结果返回为 true。在第一个 false 是停止执行计算。
noneMatch(Predicate):如果流的每个元素根据提供的 Predicate 都返回 false 时,结果返回为 true。在第一个 true 时停止执行计算。

6.查找

findFirst():返回第一个流元素的 Optional,如果流为空返回 Optional.empty。
findAny(:返回含有任意流元素的 Optional,如果流为空返回 Optional.empty。

7.信息

count():流中的元素个数。
max(Comparator):根据所传入的 Comparator 所决定的“最大”元素。
min(Comparator):根据所传入的 Comparator 所决定的“最小”元素。

8.数字流信息

average() :求取流元素平均值。
max() 和 min():数值流操作无需 Comparator。
sum():对所有流元素进行求和。
summaryStatistics():生成可能有用的数据。目前并不太清楚这个方法存在的必要性,因为我们其实可以用更直接的方法获得需要的数据。

你可能感兴趣的:(流式编程2-处理流和终端处理)