2024年Java Stream函数式编程第三篇:管道流结果处理,Java开发新手入门教程

面试题总结

其它面试题(springboot、mybatis、并发、java中高级面试总结等)

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

在开始学习之前,仍然有必要回顾一下我们之前给大家讲过的一个例子:




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管道流的话,想一想你需要多少行代码完成上面的功能呢?回到正题,这篇文章就是要给大家介绍第三阶段:对管道流处理结果都可以做哪些操作呢?下面开始吧!

二、ForEach和ForEachOrdered


如果我们只是希望将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



三、元素的收集collect


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::newPriorityQueue::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键值的唯一性。



# 最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们

**目录:**

![全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)](https://img-blog.csdnimg.cn/img_convert/a08ba6b0974cba51f7d986f34110bb2e.webp?x-oss-process=image/format,png)

Java面试核心知识点

**一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!**

![全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)](https://img-blog.csdnimg.cn/img_convert/b3e161ad7bdaa9390b2731598e12c7ea.webp?x-oss-process=image/format,png)

Java面试核心知识点

**已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了**

![全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)](https://img-blog.csdnimg.cn/img_convert/e34b7e3be9dc93e3e583e723d68d9d2d.webp?x-oss-process=image/format,png)



> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618154847)**

Java面试核心知识点

**已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了**

[外链图片转存中...(img-B1Q2Lndz-1714839156855)]



> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**

**[需要这份系统化的资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618154847)**

  • 30
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值