博客
关于我
【Java8新特性】关于Java8的Stream API,看这一篇就够了!!
阅读量:411 次
发布时间:2019-03-06

本文共 2256 字,大约阅读时间需要 7 分钟。

Java8 Stream API入门到实践

写在前面

Java8 中的两大重要改进之一是 Lambda 表达式,另一个则是 Stream API (java.util.stream.*)。Stream API 是 Java8 中处理集合数据的核心抽象概念,它允许我们通过声明性方式对数据源(如集合、数组等)进行操作,支持复杂的筛选、映射和查找等操作。Stream API 的设计理念类似于 SQL 中的查询,能够高效地处理数据,并支持并行执行。


Stream 的定义

Stream 是 Java8 中的核心抽象概念,它定义了一种数据流,用于对数据源(集合、数组等)生成元素的流式操作。Stream 本身不存储数据,它只是对数据源的操作产生一种间接的表示。Stream 的特点包括:

  • 不存储数据:Stream 不会保存数据的副本,操作仅针对数据流上的元素进行。
  • 不改变源数据:Stream 操作不会修改原数据源。
  • 延迟执行:Stream 操作是惰性求值的,只有当触发终止操作时才会执行。

  • Stream 操作的三个步骤

    Stream 操作通常分为三个步骤:

  • 创建 Stream

    从数据源(如集合、数组)获取一个 Stream。

  • 中间操作

    对 Stream 进行一系列处理,如筛选、映射等。

  • 终止操作

    执行中间操作,并将最终结果收集到一个非 Stream 的目标(如 List、Set、Map 等)。


  • 如何创建 Stream

    Java8 提供了多种方式创建 Stream:

    1. 获取 Stream

    集合接口提供了两个方法获取 Stream:

    • stream():返回一个顺序流。
    • parallelStream():返回一个并行流。

    2. 由数组创建 Stream

    Java8 的 Arrays.stream() 方法可以将数组转换为 Stream:

    int[] array = {1, 2, 3};Stream
    stream = Arrays.stream(array);

    3. 由值创建 Stream

    使用 Stream.of() 方法创建 Stream:

    Stream
    stream = Stream.of(1, 2, 3);

    4. 由函数创建 Stream

    使用 Stream.iterate()Stream.generate() 创建无限 Stream:

    Stream
    iterateStream = Stream.iterate(0L, Long::increment);Stream
    generateStream = Stream.generate(() -> Math.random());

    Stream 的中间操作

    Stream 的中间操作可以分为以下几类:

    1. 筛选与切片

    • filter(Predicate<?>):过滤数据。
    • limit(int max size):限制数据量。
    • skip(int count):跳过数据。

    2. 映射

    • map(Function<?,?>):将 Stream 中的元素映射到另一个 Stream。
    • mapToObj(Function<?, Object>):将元素映射为对象。
    • mapToInt(Function<?, Integer>):将元素映射为整数。

    3. 排序

    • sorted():按顺序排序。
    • sorted(Comparator<?>):根据自定义比较器排序。

    Stream 的终止操作

    终止操作将 Stream 转换为非 Stream 的结果类型,常见的终止操作包括:

    1. 查找与匹配

    • findFirst():返回第一个元素。
    • findAny():返回任意一个元素。
    • allMatch(Predicate<?>):判断所有元素是否满足条件。

    2. 规约

    • reduce(Object):将 Stream 累加为一个对象。
    • reduce(BinaryOperator<Object>):根据自定义操作进行规约。

    3. 收集

    • collect(Collectors.toList()):收集为 List。
    • collect(Collectors.toSet()):收集为 Set。
    • collect(Collectors.toMap(K, V, Collector.Characteristics.UNORDERED)):收集为 Map。

    并行流与串行流

    Stream API 提供了并行流和串行流的切换:

    • parallel():将 Stream 转换为并行流。
    • sequential():保持串行执行。

    并行流的优势在于可以将任务拆分到多个线程处理,从而提高性能。默认情况下,Stream 是串行执行的。


    Fork/Join 框架

    Fork/Join 框架是 Java 并行执行的基础,用于将大任务拆分为多个小任务进行处理,然后将结果合并。其核心特点是“工作窃取”模式:

    • 当一个线程提交新的任务时,它会将任务拆分为更小的子任务,并将子任务加入队列。
    • 线程会从其他线程的队列中“窃取”一个任务执行。

    相比传统线程池,Fork/Join 框架的优势在于减少了线程等待时间,提高了性能。


    写在最后

    通过对 Stream API 的学习,我们可以更高效地处理数据操作。如果你觉得文章对你有帮助,请关注 「冰河技术」 微信公众号,获取更多 Java8 新特性的学习资源。

    转载地址:http://tmvkz.baihongyu.com/

    你可能感兴趣的文章
    PLC通讯方式
    查看>>
    Please install 'webpack-cli' in addition to webpack itself to use the CLI
    查看>>
    Ploly Dash,更新一个Dash应用程序JJJA上的实时人物
    查看>>
    Ploly烛台的定制颜色
    查看>>
    Ploly:如何在Excel中嵌入完全交互的Ploly图形?
    查看>>
    plotloss记录
    查看>>
    Plotly (Python) 子图:填充构面和共享图例
    查看>>
    Plotly 中的行悬停文本
    查看>>
    Plotly 停用 x 轴排序
    查看>>
    Plotly 域变量解释(多图)
    查看>>
    Plotly 绘制表面 3D 未显示
    查看>>
    Plotly-Dash 存在未知问题并创建“加载依赖项时出错“;通过使用 Python-pandas.date_range
    查看>>
    Plotly-Dash:如何过滤具有多个数据框列的仪表板?
    查看>>
    Plotly:如何为 x 轴上的时间序列设置主要刻度线/网格线的值?
    查看>>
    Plotly:如何从 x 轴删除空日期?
    查看>>
    Plotly:如何从单条迹线制作堆积条形图?
    查看>>
    Plotly:如何以 Root 样式绘制直方图,仅显示直方图的轮廓?
    查看>>
    Plotly:如何使用 Plotly Express 组合散点图和线图?
    查看>>
    Plotly:如何使用 plotly.graph_objects 和 plotly.express 定义图形中的颜色?
    查看>>
    Plotly:如何使用 Python 对绘图对象条形图进行颜色编码?
    查看>>