- 在Java8中API新增了一个新的抽象称为流Stream,可以让我们通过声明的方式处理流Stream。我个人的理解是Stream流类似于SQL语句一样从数据库通过查询数据这种方式,将Java集合和表达进行抽象,以一种直观的方式展示出来。这个API通过干净、简洁以及高效率的代码提高Java程序员对数据的处理效率。
什么是Stream
通过这个单词的字面意思,可以知道它是流的意思,它是一个来自数据源的元素队列,且它支持类似SQL语句的聚合操作
元素 是某种类型的对象,形成一个队列,比如String类型的队列List 在Java8中,有两个方法对集合接口进行生成流: filter 方法用于通过设置的条件过滤出元素。以下代码片段使用 filter 方法过滤空字符串: 该操作将str 中的空字符去除掉后将剩余的元素返回给filter中,并不会对原本的str进行操作。 在Stream中提供了forEach来迭代每个数据,以下代码使用forEach输出了从0到9中的10个随机数 定义一个Random对象,调用ints().limit(10)随机获取10个整数后进行输出。 map 方法用于映射每个元素到对应的结果,以下代码使用map输出元素对应的平方数: 通过map(i -> i*i )得到元素对应的平方数,并通过distinct()将重复的数据去除,最后通过collect()将数据返回。 输出结果: limit 方法用于获取指定数量的流。 引用上面forEach代码片段使用 limit 方法打印出 10 条数据: 定义一个Random对象,调用ints().limit(10)随机获取10个整数后进行输出。 sorted 方法用于对流进行排序。以下代码片段使用 sorted 方法对输出的数字进行排序: 通过调用stream().sorted()将numbers中的数据进行排序 parallelStream 是流并行处理程序的代替方法。以下实例我们使用 parallelStream 来输出去除空字符串后的结果: 输出结果: Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串: 先通过filter 将空字符串去除,然后使用Collectors中的joining()将其合并成一个字符串。 用于int、double、long等基本类型上,它们可以用来产生类似如下的统计结果。 输出结果: 以上例子参考菜鸟教程Java 8 Stream | 菜鸟教程加以修改 统计学生的成绩,筛选出成绩大于60的学生,输出其名字和成绩(这里只是做例子所以名字直接使用数字代替,成绩使用random生成) 先定义一个Random对象,用于生成成绩,通过循环创建20个Student类型的对象,名字使用循环的变量i进行代替,成绩通过random.nextDouble()进行生成,通过add()方法将对象添加进列表中,然后使用stream().filter()进行筛选出成绩大于60的学生并输出 关于Stream流的内容就讲到这里了,通过Stream流我们可以写出更简洁高效的代码对这些数据进行处理,如过滤,映射,去除,查找,匹配,排序,不只是单一的操作,而是可以多个操作进行,得到我们所需要的数据,且不会对原数据进行操作,所以Stream流还是需要好好掌握的。
如何生成流
Stream() 创建串行流parallelStream() 创建并行流
filter
List
输出结果未通过Stream流操作的str:[S, t, , r, e, a, m]
通过Stream流操作的str:[S, t, , r, e, a, m]
通过Stream流操作返回的filter:[S, t, r, e, a, m]
进程已结束,退出代码为 0
forEach
Random random = new Random();
random.ints(0,10).limit(10).forEach(System.out::println);
输出结果9
0
6
0
8
3
7
9
6
0
进程已结束,退出代码为 0
map
List
[9, 4, 49, 25]
进程已结束,退出代码为 0
limit
Random random = new Random();
random.ints(0,10).limit(10).forEach(System.out::println);
输出结果9
0
6
0
8
3
7
9
6
0
进程已结束,退出代码为 0
sorted
List
输出结果2
2
3
3
3
5
7
进程已结束,退出代码为 0
并行(parallel)程序
List
未通过Stream流操作的strings:[abc, , bc, efg, abcd, , jkl]
通过Stream流操作的strings:[abc, , bc, efg, abcd, , jkl]
通过Stream流操作返回的filter:[abc, bc, efg, abcd, jkl]
进程已结束,退出代码为 0
Collectors
List
筛选列表: [S, t, r, e, a, m]
合并字符串: Stream
进程已结束,退出代码为 0
统计
List
列表中最大的数 : 7
列表中最小的数 : 2
所有数之和 : 25
平均数 : 3.5714285714285716
进程已结束,退出代码为 0
实际例子
Random random = new Random();
List
所有成绩:[0 61.0, 1 59.4, 2 19.1, 3 2.2, 4 78.8, 5 69.7, 6 98.8, 7 3.1, 8 77.7, 9 35.9, 10 60.8, 11 95.4, 12 66.4, 13 76.9, 14 51.8, 15 87.0, 16 39.0, 17 80.7, 18 79.4, 19 81.0]
筛选后的成绩:[0 61.0, 4 78.8, 5 69.7, 6 98.8, 8 77.7, 10 60.8, 11 95.4, 12 66.4, 13 76.9, 15 87.0, 17 80.7, 18 79.4, 19 81.0]
进程已结束,退出代码为 0
总结



