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

    你可能感兴趣的文章
    nodejs http小爬虫
    查看>>
    nodejs libararies
    查看>>
    nodejs npm常用命令
    查看>>
    nodejs npm常用命令
    查看>>
    Nodejs process.nextTick() 使用详解
    查看>>
    NodeJS yarn 或 npm如何切换淘宝或国外镜像源
    查看>>
    nodejs 中间件理解
    查看>>
    nodejs 创建HTTP服务器详解
    查看>>
    nodejs 发起 GET 请求示例和 POST 请求示例
    查看>>
    NodeJS 导入导出模块的方法( 代码演示 )
    查看>>
    nodejs 开发websocket 笔记
    查看>>
    nodejs 的 Buffer 详解
    查看>>
    NodeJS 的环境变量: 开发环境vs生产环境
    查看>>
    nodejs 读取xlsx文件内容
    查看>>
    nodejs 运行CMD命令
    查看>>
    Nodejs+Express+Mysql实现简单用户管理增删改查
    查看>>
    nodejs+nginx获取真实ip
    查看>>
    nodejs-mime类型
    查看>>
    NodeJs——(11)控制权转移next
    查看>>
    NodeJS、NPM安装配置步骤(windows版本)
    查看>>