博客
关于我
【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/

    你可能感兴趣的文章
    pandas 生成excel多级表头
    查看>>
    Pandas 的 DataFrame 详解-ChatGPT4o作答
    查看>>
    pandas 读取excel数据,以字典形式输出
    查看>>
    Pandas 读取具有浮点值的 csv 文件会导致奇怪的舍入和小数位数
    查看>>
    pandas 适用,但仅适用于满足条件的行
    查看>>
    pandas 重新采样到每月的特定工作日
    查看>>
    pandas :按移位分组和累加和(GroupBy Shift And Cumulative Sum)
    查看>>
    pandas :检测一个DF和另一个DF之间缺失的列
    查看>>
    Pandas-从具有嵌套列表列表的现有列创建动态列时出错
    查看>>
    Pandas-通过对列和索引的值求和来合并两个数据框
    查看>>
    pandas.columns、get_dummies等用法
    查看>>
    pandas.DataFrame.copy(deep=True) 实际上并不创建深拷贝
    查看>>
    pandas.read_csv()的详解-ChatGPT4o作答
    查看>>
    PANDAS.READ_EXCEL()输出‘;溢出错误:日期值超出范围‘;而不存在日期列
    查看>>
    pandas100个骚操作:再见 for 循环!速度提升315倍!
    查看>>
    Pandas:如何根据其他列值的条件对列进行求和?
    查看>>
    Pandas:对给定列求和 DataFrame 行
    查看>>
    Pandas、Matplotlib、Pyecharts数据分析实践
    查看>>
    Pandas中文官档~基础用法2
    查看>>
    Pandas中文官档~基础用法5
    查看>>