zoukankan      html  css  js  c++  java
  • JDK8- java.util.stream 库笔记

    所有流计算都有一种共同的结构:它们具有一个流来源、0 或多个中间操作,以及一个终止操作

    流的元素可以是对象引用 (Stream<String>),也可以是原始整数 (IntStream)、长整型 (LongStream) 或双精度 (DoubleStream)。

    JDK 中的流来源
    方法描述
    Collection.stream() 使用一个集合的元素创建一个流。
    Stream.of(T...) 使用传递给工厂方法的参数创建一个流。
    Stream.of(T[]) 使用一个数组的元素创建一个流。
    Stream.empty() 创建一个空流。
    Stream.iterate(T first, BinaryOperator<T> f) 创建一个包含序列 first, f(first), f(f(first)), ... 的无限流
    Stream.iterate(T first, Predicate<T> test, BinaryOperator<T> f) (仅限 Java 9)类似于 Stream.iterate(T first, BinaryOperator<T> f),但流在测试预期返回 false 的第一个元素上终止。
    Stream.generate(Supplier<T> f) 使用一个生成器函数创建一个无限流。
    IntStream.range(lower, upper) 创建一个由下限到上限(不含)之间的元素组成的 IntStream
    IntStream.rangeClosed(lower, upper) 创建一个由下限到上限(含)之间的元素组成的 IntStream
    BufferedReader.lines() 创建一个有来自 BufferedReader 的行组成的流。
    BitSet.stream() 创建一个由 BitSet 中的设置位的索引组成的 IntStream
    Stream.chars() 创建一个与 String 中的字符对应的 IntStream

    中间操作负责将一个流转换为另一个流,中间操作包括 filter()(选择与条件匹配的元素)、map()(根据函数来转换元素)、distinct()(删除重复)、limit()(在特定大小处截断流)和 sorted()

    中间流操作
    操作内容
    filter(Predicate<T>) 与预期匹配的流的元素
    map(Function<T, U>) 将提供的函数应用于流的元素的结果
    flatMap(Function<T, Stream<U>> 将提供的流处理函数应用于流元素后获得的流元素
    distinct() 已删除了重复的流元素
    sorted() 按自然顺序排序的流元素
    Sorted(Comparator<T>) 按提供的比较符排序的流元素
    limit(long) 截断至所提供长度的流元素
    skip(long) 丢弃了前 N 个元素的流元素
    takeWhile(Predicate<T>) (仅限 Java 9)在第一个提供的预期不是 true 的元素处阶段的流元素
    dropWhile(Predicate<T>) (仅限 Java 9)丢弃了所提供的预期为 true 的初始元素分段的流元素

    中间操作始终是惰性的:调用中间操作只会设置流管道的下一个阶段,不会启动任何操作。

    重建操作可进一步划分为无状态 和有状态 操作。

    无状态操作(比如 filter() 或 map())可独立处理每个元素,而有状态操作(比如 sorted() 或 distinct())可合并以前看到的影响其他元素处理的元素状态。

    数据集的处理在执行终止操作时开始,比如缩减(sum() 或 max())、应用 (forEach()) 或搜索 (findFirst()) 操作。

    终止操作会生成一个结果或副作用。
    执行终止操作时,会终止流管道,如果您想再次遍历同一个数据集,可以设置一个新的流管道。

    终止流操作
    操作描述
    forEach(Consumer<T> action) 将提供的操作应用于流的每个元素。
    toArray() 使用流的元素创建一个数组。
    reduce(...) 将流的元素聚合为一个汇总值。
    collect(...) 将流的元素聚合到一个汇总结果容器中。
    min(Comparator<T>) 通过比较符返回流的最小元素。
    max(Comparator<T>) 通过比较符返回流的最大元素。
    count() 返回流的大小。
    {any,all,none}Match(Predicate<T>) 返回流的任何/所有元素是否与提供的预期相匹配。
    findFirst() 返回流的第一个元素(如果有)。
    findAny() 返回流的任何元素(如果有)。

    流与集合比较

    尽管流在表面上可能类似于集合(您可以认为二者都包含数据),但事实上,它们完全不同。集合是一种数据结构;它的主要关注点是在内存中组织数据,而且集合会在一段时间内持久存在。集合通常可用作流管道的来源或目标,但流的关注点是计算,而不是数据。数据来自其他任何地方(集合、数组、生成器函数或 I/O 通道),而且可通过一个计算步骤管道处理来生成结果或副作用,在此刻,流已经完成了。流没有为它们处理的元素提供存储空间,而且流的生命周期更像一个时间点 — 调用终止操作。不同于集合,流也可以是无限的;相应地,一些操作(limit()findFirst())是短路,而且可在无限流上运行有限的计算。

    集合和流在执行操作的方式上也不同。集合上的操作是急切和突变性的;在 List 上调用 remove() 方法时,调用返回后,您知道列表状态会发生改变,以反映指定元素的删除。对于流,只有终止操作是急切的;其他操作都是惰性的。流操作表示其输入(也是流)上的功能转换,而不是数据集上的突变性操作(过滤一个流会生成一个新流,新流的元素是输入流的子集,但没有从来源删除任何元素)。

  • 相关阅读:
    Spring AOP + Redis 实现针对用户的接口访问频率限制
    Flutter 圆形透明 Loading 弹窗
    VUE 自定义组件的双向数据绑定 和替代钩子
    10个前端技巧
    前端中的数据库
    cors 跨域问题
    promise解决回调地狱问题
    VUE框架JS组件的封装 --Vue.extend
    HBuilderX 用夜神模拟器运行vue项目
    vue关于axios 拦截器的使用
  • 原文地址:https://www.cnblogs.com/litaiqing/p/6026682.html
Copyright © 2011-2022 走看看