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

    你可能感兴趣的文章
    Python rsa 加密
    查看>>
    Python RSA操作
    查看>>
    Python轻松实现统计学中重要的相关性分析
    查看>>
    Python scrapy 常见问题及解决 【遇到的坑】
    查看>>
    Python Seborn热图数据的动态更新
    查看>>
    Python Seborn绘制空白直方图
    查看>>
    Python Selenium - 获取href值
    查看>>
    Python Selenium实现自动化测试及Chrome驱动使用!
    查看>>
    Python Selenium搭建UI自动化测试框架
    查看>>
    Python Selenium模块详解
    查看>>
    Python selenium爬取影评生成词云图
    查看>>
    python selenium自动化测试报告
    查看>>
    Python selenium自动化测试框架实战 —— 登录测试案例
    查看>>
    Python Selenium设计模式 —— POM
    查看>>
    Python Serial:如何使用 read 或 readline 函数一次读取多个字符
    查看>>
    Python set([]) 如何检查两个对象是否相等?一个对象需要定义哪些方法来自定义它?
    查看>>
    Python setup.py:数据文件无法复制目录:不存在或不是常规文件
    查看>>
    Python setuptools sdist:仅安装版本化文件
    查看>>
    Python Shell下使用matplotlib
    查看>>
    Python Slice How-to,我知道Python Slice,但我怎么才能使用内置的Slice对象呢?
    查看>>