进一步了解Stream

骑猪看日落 2022-12-23 07:29 218阅读 0赞

前面我们已对Stream有个初步的了解,现在在深入了解下吧。

一、概述

Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。

特点:

  • 不是数据结构,不会保存数据。
  • 不会修改原来的数据源,它会将操作后的数据保存到另外一个对象中。(保留意见:毕竟peek方法可以修改流中元素)
  • 惰性求值,流在中间处理过程中,只是对操作进行了记录,并不会立即执行,需要等到执行终止操作的时候才会进行实际的计算。

二、流到底是什么

简短的定义就是“从支持数据处理操作的源生成的元素序列”。让我们一步步剖析这个定义。

  • 元素序列——就像集合一样,流也提供了一个接口,可以访问特定元素类型的一组有序
    值。因为集合是数据结构,所以它的主要目的是以特定的时间/空间复杂度存储和访问元
    素(如ArrayList 与 LinkedList)。但流的目的在于表达计算,比如你前面见到的
    filter、sorted和map。集合讲的是数据,流讲的是计算。
  • 源——流会使用一个提供数据的源,如集合、数组或输入/输出资源。 请注意,从有序集
    合生成流时会保留原有的顺序。由列表生成的流,其元素顺序与列表一致。
  • 数据处理操作——流的数据处理功能支持类似于数据库的操作,以及函数式编程语言中
    的常用操作,如filter、map、reduce、find、match、sort等。流操作可以顺序执
    行,也可并行执行。

此外,流操作有两个重要的特点。

  • 流水线——很多流操作本身会返回一个流,这样多个操作就可以链接起来,形成一个大
    的流水线。这让优化某些操作成为可能,如延迟和短路。流水线的操作可以
    看作对数据源进行数据库式查询。
  • 内部迭代——与使用迭代器显式迭代的集合不同,流的迭代操作是在背后进行的。

三、流的使用

java.util.stream.Stream中的Stream接口定义了许多操作。它们可以分为两大类。我
们来看一下例子:
在这里插入图片描述
你可以看到两类操作:

  • filter、map和limit可以连成一条流水线;
  • collect触发流水线执行并关闭它。
    可以连接起来的流操作称为中间操作,关闭流的操作称为终端操作。 下面展示了这两类
    操作。这种区分有什么意义呢?
    在这里插入图片描述

总而言之,流的使用一般包括三件事:

  • 一个数据源(如集合)来执行一个查询;
  • 一个中间操作链,形成一条流的流水线;
  • 一个终端操作,执行流水线,并能生成结果。
    流的流水线背后的理念类似于构建器模式。①在构建器模式中有一个调用链用来设置一套配
    置(对流来说这就是一个中间操作链),接着是调用built方法(对流来说就是终端操作)。
    在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,218人围观)

还没有评论,来说两句吧...

相关阅读

    相关 进一步了解Stream

    前面我们已对Stream有个初步的了解,现在在深入了解下吧。 一、概述 Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执

    相关 进一步学习mysql

    在开放中,会员的优化,往往上把频繁用到的信息,优先考虑效率,存储到一张表中,不常用的信息和比较占空间的信息,优先考虑空间占用,存储到辅表中。 一、建表语法: 声明列的过程