Java 8 API 增加了一个新的抽象称为流 Stream,可以让你以一种声明的方式处理数据。Stream 使用一种类似 SQL 语句从数据库查询数据的方式来提供一种对 Java 集合运算和表达的高阶抽象。这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如筛选、排序、聚合等。如果你之前有 RxJava 的使用经历,应该不会对流的操作感到陌生,并且 Stream 要比 RxJava 更容易上手。
元素流在管道中经过中间操作的处理,最后由最终操作得到前面处理的结果。下图展示了元素流经过筛选、排序、映射操作后,最终被转换成聚合元素的过程。后续我们将会对 Stream 的各种操作符进行展示。
1. 生成流
1.1 随机数
1 | /*** 随机数方式生成流 ***/ |
1 | /***** 数据输出结果 *****/ |
1.2 正则匹配
1 | /**** 正则方式生成流 ****/ |
1 | /***** 数据输出结果 *****/ |
2. 数据操作
2.1 分组
2.1.1 数据准备
1 | /***** 实体类 User *****/ |
1 | /**** 新建 User 实例 ****/ |
1 | /**** 获取 User 集合 ****/ |
2.1.2 按等级分组
1 | /***** 原始代码分组 *****/ |
1 | /***** 数据输出结果 *****/ |
2.1.3 按等级分组获取用户名
1 | /***** 原始代码分组 *****/ |
1 | /***** 数据输出结果 *****/ |
2.1.4 按等级分组统计人数
1 | /***** 原始代码分组 *****/ |
1 | /***** 数据输出结果 *****/ |
2.1.5 按等级统计平均积分
1 | /***** 原始代码分组 *****/ |
1 | /***** 数据输出结果 *****/ |
2.1.6 按等级分组统计用户资产
1 | /***** 原始代码分组 *****/ |
1 | /***** 数据输出结果 *****/ |
2.2 统计
一些统计结果的收集器也非常有用,它们主要用于 int
、double
、long
等基本类型,可以用来产生类似如下的统计结果。
1 | /***** 原始代码统计 *****/ |
1 | /***** 数据输出结果 *****/ |
2.3 并行流
在 Java 8 中, 集合接口有两个方法来生成流:stream() 和 parallelStream()。他们的区别在于,stream 是顺序流,由主线程按顺序对流执行操作,而 parallelStream 是并行流,内部以多线程并行执行的方式对流进行操作,但前提是流中的数据处理没有顺序要求。如果流中的数据量足够大,并行流可以加快处速度。例如筛选集合中的奇数,两者的处理不同之处:
方法名 | 中文概念 | 描述 |
---|---|---|
stream() | 顺序流 | 为集合创建串行流 |
parallelStream() | 并行流 | 为集合创建并行流 |
1 | /***** parallelStream() 直接创建并行流 *****/ |
1 | /***** 数据输出结果 *****/ |