📔C4 Streams介绍

type
status
date
summary
slug
tags
category
icon
password
这一章的主要内容包括: 1.Streams简介 2.Collections和Streams比较 3.内部迭代和外部迭代 4.中间操作和终端操作

Streams简介

Streams可以让你通过声明式编程处理集合,并且还能隐式实现并行操作
下面是一段运用streams API的代码。
在运用parallelStream时,有两个问题:
·使用了多少线程?
·性能得到了什么优化?
可以看到,这段代码通过filtersortedmap方法实现了链式编程,最后通过collect 方法收集stream流内的元素。
诸如filtersortedmap 等方法作为不依赖于特定线程模型的高级构建块(high-level building blocks)提供,它们的内部实现可以是单线程的,也可以隐式最大化多核架构(multicore architecture)。

Streams vs. collections

streams注重数据处理,而collections注重数据本身。
二者最大的区别在于数据何时进行计算。对于集合,数据在进入集合之前必须都经过计算;对于流,它是一种概念上固定的数据结构(不能往里面添加或者删除元素),数据是按需进行计算的。
拿播放视频作为例子,集合像是一张DVD光盘,而流更接近于你在流媒体网站上观看视频。
notion image
❗一个流只能被遍历一次!被遍历一次后,这个流就相当于被消耗了。

内部迭代和外部迭代

这部分概念很简单。集合使用外部迭代,而流使用内部迭代。
下面是一段使用for-each 循环遍历menu的代码:
下面是一段使用流遍历menu 的代码:
通过代码我们可以感受到,二者有以下区别。
  • 流可以一次性处理所有数据,通过诸如mapfilter 等方法。
  • 流可以隐式地实现并行操作,无需我们实现并行控制。

中间操作和终端操作

中间操作即链式编程中的filter、map、limit、sorted、distinct 等方法,它们的返回值依然是一个stream 类型。
终端操作即链式编程中的forEach、count、collect 等方法,它们的返回值可以是除stream 外的任何数据结构。
关于这部分的具体内容可以查看Java8 In Action C5.

总结

  • 流是来自支持数据处理操作的源的元素序列。
  • 流使用内部迭代。
  • 流使用中间操作来构建一个管道,这个管道并不产生结果。
  • 流使用终端操作来对管道的数据进行处理,并返回结果。
  • 流的数据是按需处理的。
Prev
C3 Lambda详解
Next
建站教程
Loading...