在本号之前写过的文章中,曾经给大家介绍过 Java Stream管道流是用于简化集合类元素处理的java API。在使用的过程中分为三个阶段。在开始本文之前,我觉得仍然需要给一些新朋友介绍一下这三个阶段,如图:
-
第一阶段(图中蓝色):将集合、数组、或行文本文件转换为java Stream管道流
-
第二阶段(图中虚线部分):管道流式数据处理操作,处理管道中的每一个元素。上一个管道中的输出元素作为下一个管道的输入元素。
-
第三阶段(图中绿色):管道流结果处理操作,也就是本文的将介绍的核心内容。
在开始学习之前,仍然有必要回顾一下我们之前给大家讲过的一个例子:
List<String> nameStrs = Arrays.asList("Monkey", "Lion", "Giraffe","Lemur");
List<String> list = nameStrs.stream()
.filter(s -> s.startsWith("L"))
.map(String::toUpperCase)
.sorted()
.collect(toList());
System.out.println(list);
-
首先使用stream()方法将字符串List转换为管道流Stream
-
然后进行管道数据处理操作,先用fliter函数过滤所有大写L开头的字符串,然后将管道中的字符串转换为大写字母toUpperCase,然后调用sorted方法排序。这些API的用法在本号之前的文章有介绍过。其中还使用到了lambda表达式和函数引用。
-
最后使用collect函数进行结果处理,将java Stream管道流转换为List。最终list的输出结果是:
[LEMUR, LION]
如果你不使用java Stream管道流的话,想一想你需要多少行代码完成上面的功能呢?回到正题,这篇文章就是要给大家介绍第三阶段:对管道流处理结果都可以做哪些操作呢?下面开始吧!
如果我们只是希望将Stream管道流的处理结果打印出来,而不是进行类型转换,我们就可以使用forEach()方法或forEachOrdered()方法。
Stream.of("Monkey", "Lion", "Giraffe", "Lemur", "Lion")
.parallel()
.forEach(System.out::println);
Stream.of("Monkey", "Lion", "Giraffe", "Lemur", "Lion")
.parallel()
.forEachOrdered(System.out::println);
-
parallel()函数表示对管道中的元素进行并行处理,而不是串行处理,这样处理速度更快。但是这样就有可能导致管道流中后面的元素先处理,前面的元素后处理,也就是元素的顺序无法保证
-
forEachOrdered从名字上看就可以理解,虽然在数据处理顺序上可能无法保障,但是forEachOrdered方法可以在元素输出的顺序上保证与元素进入管道流的顺序一致。也就是下面的样子(forEach方法则无法保证这个顺序):
Monkey
Lion
Giraffe
Lemur
Lion
java Stream 最常见的用法就是:一将集合类转换成管道流,二对管道流数据处理,三将管道流处理结果在转换成集合类。那么collect()方法就为我们提供了这样的功能:将管道流处理结果在转换成集合类。
3.1.收集为Set
通过Collectors.toSet()方法收集Stream的处理结果,将所有元素收集到Set集合中。
Set<String> collectToSet = Stream.of(
"Monkey", "Lion", "Giraffe", "Lemur", "Lion"
)
.collect(Collectors.toSet());
//最终collectToSet 中的元素是:[Monkey, Lion, Giraffe, Lemur],注意Set会去重。
3.2.收集到List
同样,可以将元素收集到List
使用toList()
收集器中。
List<String> collectToList = Stream.of(
"Monkey", "Lion", "Giraffe", "Lemur", "Lion"
).collect(Collectors.toList());
// 最终collectToList中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]
3.3.通用的收集方式
上面为大家介绍的元素收集方式,都是专用的。比如使用Collectors.toSet()收集为Set类型集合;使用Collectors.toList()收集为List类型集合。那么,有没有一种比较通用的数据元素收集方式,将数据收集为任意的Collection接口子类型。
所以,这里就像大家介绍一种通用的元素收集方式,你可以将数据元素收集到任意的Collection类型:即向所需Collection类型提供构造函数的方式。
LinkedList<String> collectToCollection = Stream.of(
"Monkey", "Lion", "Giraffe", "Lemur", "Lion"
).collect(Collectors.toCollection(LinkedList::new));
//最终collectToCollection中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]
注意:代码中使用了LinkedList::new,实际是调用LinkedList的构造函数,将元素收集到Linked List。当然你还可以使用诸如LinkedHashSet::new
和PriorityQueue::new
将数据元素收集为其他的集合类型,这样就比较通用了。
3.4.收集到Array
通过toArray(String[]::new)方法收集Stream的处理结果,将所有元素收集到字符串数组中。
String[] toArray = Stream.of(
"Monkey", "Lion", "Giraffe", "Lemur", "Lion"
) .toArray(String[]::new);
//最终toArray字符串数组中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]
3.5.收集到Map
使用Collectors.toMap()方法将数据元素收集到Map里面,但是出现一个问题:那就是管道中的元素是作为key,还是作为value。我们用到了一个Function.identity()方法,该方法很简单就是返回一个“ t -> t ”(输入就是输出的lambda表达式)。另外使用管道流处理函数distinct()
来确保Map键值的唯一性。
Map<String, Integer> toMap = Stream.of(
"Monkey", "Lion", "Giraffe", "Lemur", "Lion"
)
.distinct()
.collect(Collectors.toMap(
Function.identity(), //元素输入就是输出,作为key
s -> (int) s.chars().distinct().count()// 输入元素的不同的字母个数,作为value
));
# 复习的面试资料
> 这些面试全部出自大厂面试真题和面试合集当中,小编已经为大家整理完毕(PDF版)
>
* **第一部分:Java基础-中级-高级**
![image](https://img-blog.csdnimg.cn/img_convert/f543e8caddc80590f2bfe011563b6fca.webp?x-oss-process=image/format,png)
* **第二部分:开源框架(SSM:Spring+SpringMVC+MyBatis)**
![image](https://img-blog.csdnimg.cn/img_convert/cba3edecf792b6ce33ed04df48bb8e77.webp?x-oss-process=image/format,png)
* **第三部分:性能调优(JVM+MySQL+Tomcat)**
![image](https://img-blog.csdnimg.cn/img_convert/b5ee5f1a53762871e812e28f17c298d3.webp?x-oss-process=image/format,png)
* **第四部分:分布式(限流:ZK+Nginx;缓存:Redis+MongoDB+Memcached;通讯:MQ+kafka)**
![image](https://img-blog.csdnimg.cn/img_convert/b506ff790c0ab58b9563dc184784ef78.webp?x-oss-process=image/format,png)
* **第五部分:微服务(SpringBoot+SpringCloud+Dubbo)**
![image](https://img-blog.csdnimg.cn/img_convert/fe5b3c69631c74952c8695606c13d308.webp?x-oss-process=image/format,png)
* **第六部分:其他:并发编程+设计模式+数据结构与算法+网络**
![image](https://img-blog.csdnimg.cn/img_convert/9c33ba157f11424cbca0675be9e87077.webp?x-oss-process=image/format,png)
# 进阶学习笔记pdf
>* **Java架构进阶之架构筑基篇(**Java基础+并发编程+JVM+MySQL+Tomcat+网络+数据结构与算法**)**
![image](https://img-blog.csdnimg.cn/img_convert/c9c83b38674dd36bb3aa6650abba8b7c.webp?x-oss-process=image/format,png)
* **Java架构进阶之开源框架篇(**设计模式+Spring+SpringMVC+MyBatis**)**
![image](https://img-blog.csdnimg.cn/img_convert/d2c7080ca8362c893487d449bdae3efe.webp?x-oss-process=image/format,png)
![image](https://img-blog.csdnimg.cn/img_convert/52dc3c7d37af15a1bfd12cbe571bd120.webp?x-oss-process=image/format,png)
![image](https://img-blog.csdnimg.cn/img_convert/017814acfe5828a41af027827736688b.webp?x-oss-process=image/format,png)
* **Java架构进阶之分布式架构篇 (**限流(ZK/Nginx)+缓存(Redis/MongoDB/Memcached)+通讯(MQ/kafka)**)**
![image](https://img-blog.csdnimg.cn/img_convert/bcf623e7384afdf8e21a9c653fec8e6a.webp?x-oss-process=image/format,png)
![image](https://img-blog.csdnimg.cn/img_convert/1f88e66c265da4d0561835e01d3d8d5d.webp?x-oss-process=image/format,png)
![image](https://img-blog.csdnimg.cn/img_convert/cac6baa43585bc61ed31f2efc4c8380a.webp?x-oss-process=image/format,png)
* **Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)**
![image](https://img-blog.csdnimg.cn/img_convert/07588f08628c9f55c57368258991d70f.webp?x-oss-process=image/format,png)
![image](https://img-blog.csdnimg.cn/img_convert/10ad03cee0434017725da28670e034aa.webp?x-oss-process=image/format,png)
了解详情https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB
[外链图片转存中...(img-456X9Ivd-1724418205324)]
[外链图片转存中...(img-OiKHdbBt-1724418205324)]
[外链图片转存中...(img-IIceWKsj-1724418205325)]
* **Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)**
[外链图片转存中...(img-VuLoXpYI-1724418205325)]
[外链图片转存中...(img-j3LOokTB-1724418205326)]
了解详情https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB