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

  • 相关阅读:
    重新想象 Windows 8 Store Apps (15) 控件 UI: 字体继承, Style, ControlTemplate, SystemResource, VisualState, VisualStateManager
    重新想象 Windows 8 Store Apps (12) 控件之 GridView 特性: 拖动项, 项尺寸可变, 分组显示
    返璞归真 asp.net mvc (10) asp.net mvc 4.0 新特性之 Web API
    与众不同 windows phone (29) Communication(通信)之与 OData 服务通信
    与众不同 windows phone (33) Communication(通信)之源特定组播 SSM(Source Specific Multicast)
    与众不同 windows phone (27) Feature(特性)之搜索的可扩展性, 程序的生命周期和页面的生命周期, 页面导航, 系统状态栏
    与众不同 windows phone (30) Communication(通信)之基于 Socket TCP 开发一个多人聊天室
    返璞归真 asp.net mvc (12) asp.net mvc 4.0 新特性之移动特性
    重新想象 Windows 8 Store Apps (2) 控件之按钮控件: Button, HyperlinkButton, RepeatButton, ToggleButton, RadioButton, CheckBox, ToggleSwitch
    重新想象 Windows 8 Store Apps (10) 控件之 ScrollViewer 特性: Chaining, Rail, Inertia, Snap, Zoom
  • 原文地址:https://www.cnblogs.com/litaiqing/p/6026682.html
Copyright © 2011-2022 走看看