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

    你可能感兴趣的文章
    tableviewcell 中使用autolayout自适应高度
    查看>>
    Symbolic Aggregate approXimation(SAX,符号聚合近似)介绍-ChatGPT4o作答
    查看>>
    Orcale表被锁
    查看>>
    svn访问报错500
    查看>>
    sum(a.YYSR) over (partition by a.hy_dm) 不需要像group by那样需要分组函数。方便。
    查看>>
    ORCHARD 是什么?
    查看>>
    Struts2中使用Session的两种方法
    查看>>
    STM32工作笔记0032---编写跑马灯实验---寄存器版本
    查看>>
    order by rand()
    查看>>
    SSM(Spring+SpringMvc+Mybatis)整合开发笔记
    查看>>
    Orderer节点启动报错解决方案:Not bootstrapping because of 3 existing channels
    查看>>
    org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement profile
    查看>>
    sql查询中 查询字段数据类型 int 与 String 出现问题
    查看>>
    org.apache.commons.beanutils.BasicDynaBean cannot be cast to ...
    查看>>
    org.apache.dubbo.common.serialize.SerializationException: com.alibaba.fastjson2.JSONException: not s
    查看>>
    sqlserver学习笔记(三)—— 为数据库添加新的用户
    查看>>
    org.apache.http.conn.HttpHostConnectException: Connection to refused
    查看>>
    org.apache.ibatis.binding.BindingException: Invalid bound statement错误一例
    查看>>
    org.apache.ibatis.exceptions.PersistenceException:
    查看>>
    org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned
    查看>>