Java8 Stream流

383 阅读5分钟

什么是Stream流?

简短的定义就是“从支持数据处理操作的源生成的元素序列 Stream 翻译称为 “流”,是 Java8 的新特性之一

Stream 将要处理的元素看作是流,这时可以借助 Stream API 对流中的元素进行中间操作,比如:筛选、排序、排序等

  1. 元素序列:就像集合一样,流也提供了一个接口,可以访问特定元素类型的一组有序值。因为集合是数据结构,所以它的主要目的是以特定的时间/空间复杂度存储和访问元素(如ArrayList 与 LinkedList)。但流的目的在于表达计算,比如filter、 sorted和map。集合讲的是数据,流讲的是计算

  2. 源:流会使用一个提供数据的源,如集合、数组或输入/输出资源。 请注意,从有序集合生成流时会保留原有的顺序。由列表生成的流,其元素顺序与列表一致

  3. 数据处理操作:流的数据处理功能支持类似于数据库的操作,以及函数式编程语言中的常用操作,如filter、 map、 reduce、 find、 match、 sort等。流操作可以顺序执行,也可并行执行

  4. 流水线:很多流操作本身会返回一个流,这样多个操作就可以链接起来,形成一个大的流水线,流水线的操作可以看作对数据源进行数据库式查询

  5. 内部迭代:与使用迭代器显式迭代的集合不同,流的迭代操作是在背后进行的

特点

  • 不是数据结构,不会保存数据,只会操作数据
  • 不会改变数据源,它会将操作后的数据保存到另外一个对象中
  • 延迟执行,流在中间处理过程中,只是对操作进行了记录,并不会立即执行,需要等到执行终止操作的时候才会进行实际的计算

实现stream流的三个步骤

  • 1、创建Stream: 从数据源中获取一个流,这个数据源可以是集合、数组
  • 2、中间操作:操作链,可以对流进行数据处理
  • 3、终止操作:执行终止操作,才会执行中间操作的操作链,终端操作结束后流无法再次使用,会产生一个新的结果

stream流常用方法

1、forEach:

forEach接收消费类型的函数式接口,为Stream流的最终方法,调用后不能再调用Stream流的其它方法了

若只有一个参数则可以省略“()”

参数的类型也可省略,java编译器会自动推断参数类型

若方法体只有一行代码则可以省略“{}”

image.png image.png

2、filter

过滤,延迟方法,接收判断类型的函数式接口,产生新的子集流,调用后还可以继续调用其它的Stream流方法

若写了{}则必须用return返回结果

若省略了{}则不需要return返回结果 image.png

3、map

延迟方法,操作Stream流数据中的每个元素,将Stream流映射到一个新的Stream流上

操作数据中的每个元素,改变该元素的值或者类型等等 image.png

4、count

最终方法,没有参数,没有方法体,属于Stream流的最终方法,用于统计Stream流中的数据长度,返回long类型

image.png

5、limit

延迟方法,截取Stream流中的前几个元素返回新的Stream流,入参为long类型,没有方法体

若入参的值大于Stream流中的数据的长度则返回由原数据组成的新Stream流 image.png

6、skip

延迟方法,入参为long类型,没有方法体,跳过前一个Stream流的前几个元素,得到由后面的元素组成的新Stream流 image.png

7、concat

Stream的静态方法,将多个Stream流的数据按入参顺序合并为一个新的Stream流 image.png

注意:

由于流与我们经常操作的类型不太一样,所以一般把流转换成集合(如:list,set,map等)在进行一些其他操作

image.png

Stream有以下特性及优点:

  • 无存储。Stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等
  • 为函数式编程而生。对Stream的任何修改都不会修改背后的数据源,比如对Stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新Stream
  • 惰式执行。Stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行
  • 可消费性。Stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成

注意:

stream流对于一些简单常见的操作使用起来比较方便,也可以简化代码,使得代码变得简洁明了,但是对于一些复杂的逻辑判断,虽然使用stream流也能解决,但是不建议使用,对于不熟悉的人来说,反而降低了代码的可读性

今天的分享就到这里啦,希望能给您带来帮助!!!