美文网首页
流式编程2-处理流和终端处理

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

作者: 逢栲怭過 | 来源:发表于2020-04-09 20:15 被阅读0次

    一.中间操作

    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-处理流和终端处理

          本文链接:https://www.haomeiwen.com/subject/miyhmhtx.html