Stream API 简单介绍-入门使用
目录
一、为什么要使用 Stream API
实际开发中,项目中多数数据源都来自于 Mysql,Oracle 等。但现在数据源可以更多了,有 MongDB,Radis 等,而这些 NoSQL 的数据就需要 Java 层面去处理。
Stream 和 Collection 集合的区别:Collection 是一种静态的内存数据结构,而 Stream 是有关计算的。前者是主要面向内存,存储在内存中,后者主要是面向 CPU,通过 CPU 实现计算。
二、什么是 Stream
Stream(流)是一个来自数据源的元素队列并支持聚合操作
- 元素是特定类型的对象,形成一个队列。 Java 中的 Stream 并不会存储元素,而是按需计算。
- 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器 generator 等。
- 聚合操作 类似 SQL 语句一样的操作, 比如 filter, map, reduce, find, match, sorted 等。
和以前的 Collection 操作不同, Stream 操作还有两个基础的特征:
- Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行 (laziness) 和短路(short-circuiting)。
- 内部迭代: 以前对集合遍历都是通过 Iterator 或者 For-Each 的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream 提供了内部迭代的方式, 通过访问者模式 (Visitor) 实现。
集合讲的是数据,Stream 讲的是计算!
注意:
- Stream 自己不会存储元素。
- Stream 不会改变源对象。相反,他们会返回一个持有结果的新 Stream。
- Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。
三、Stream 操作的三个步骤
步骤:
- 创建 Stream
- 中间操作
- 终止操作
1、创建 Stream
在 Java 8 中, 集合接口有两个方法来生成流:
- stream() 为集合创建串行流。
- parallelStream() 为集合创建并行流。
- Arrays 的静态方法 stream()
- Stream 的 of()
2、Stream 的中间操作
多个中间操作可以连接起来形成一个流水线。
2.1、筛选与切片
2.2、映射
2.3、排序
3、Stream 的终止操作
终端操作会从流的流水线生成结果。其结果可以是任何值,但不是流的值,例如:List、Integer,甚至是 void 。
流进行了终止操作后,不能再次使用。
count()
返回流中元素总数max(Comparator c)
返回流中最大值min(Comparator c)
返回流中最小值forEach(Consumer c)
内部迭代 (使用 Collection 接口需要用户去做迭代,称为外部迭代。相反,Stream API 使用内部迭代——它帮你把迭代做了)
归约和收集
reduce(T iden, BinaryOperator b)
可以将流中元素反复结合起来,得到一个值。返回 Tcollect(Collector c)
将流转换为其他形式。接收一个 Collector 接口的实现,用于给 Stream 中元素做汇总的方法
四、Collectors 工具类操作
Collectors 类作为 Collector 接口对应的工具类,除提供了对应的实现类(CollectorImpl) 以外, 还提供了各种快速生成 Collector 实例的工具方法。
参考: