在本号之前写过的文章中,曾经给大家介绍过 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::toupperca) .sorted() .collect(tolist());system.out.println(list);
首先使用stream()方法将字符串list转换为管道流stream然后进行管道数据处理操作,先用fliter函数过滤所有大写l开头的字符串,然后将管道中的字符串转换为大写字母toupperca,然后调用sorted方法排序。这些api的用法在本号之前的文章有介绍过。其中还使用到了lamb校园文化建设方案da表达式和函数引用。最后使用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()方法就为我们提供了这样的功能:将管道流处理结果在转换成集合类。
通过collectors.tot()方法收集stream的处理结果,将所有元素收集到t集合中。
t<string> collecttot = stream.of( "monkey", "lion", "giraffe", "lemur", "lion") .collect(collectors.tot());//最终collecttot 中的元素是:[monkey, lion, giraffe, lemur],注意t会去重。
同样,可以将元素收集到list
使用tolist()
收集器中。
list<string> collecttolist = stream.of( "monkey", "lion", "giraffe", "lemur", "lion").collect(collectors.tolist());// 最终collecttolist中的元素是: [monkey, lion, giraffe, lemur, lion]
3.3.通用的收集方式
上面为大家介绍的元素收集方式,都是专用的。比如使用collectors.tot()收集为t类型集合;使用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。当然你还可以使用诸如linkedhasht::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));// 最终tomap的结果是: {monkey=6, lion=4, lemur=5, giraffe=6}
3.6.分组收集groupingby
collectors.groupingby用来实现元素的分组收集,下面的代码演示如何根据首字母将不同的数据元素收集到不同的list,并封装为map。
map<character, list<string>> groupingbylist = stream.of( "monkey", "lion", "giraffe", "lemur", "lion").collect(collectors.groupingby( s -> s.charat(0) , //根据元素首字母分组,相同的在一组 // counting() // 加上这一行代码可以实现分组统计));// 最终groupingbylist内的元素: {g=[giraffe], l=[lion, lemur, lion], m=[monkey]}//如果加上counting() ,结果是: {g=1, l=3, m=1}
四、其他常用方法
boolean containstwo = intstream.of(1, 2, 3).anymatch(i -> i == 2);// 判断管道中是否包含2,结果是: truelong nrofanimals = stream.of( "monkey", "lion", "giraffe", "lemur").count();// 管道中元素数据总计结果nrofanimals: 4int sum = intstream.of(1, 2, 3).sum();// 管道中元素数据累加结果sum: 6optionaldouble average = intstream.of(1, 2, 3).average();//管道中元素数据平均值average: optionaldouble[2.0]int max = intstream.of(1, 2, 3).max().orel(0);//管道中元素数据最大值max: 3intsummarystatistics statistics = intstream.of(1, 2, 3).summarystatistics();// 全面的统计结果statistics: intsummarystatistics{count=3, sum=6, min=1, average=2.000000, max=3}
本文发布于:2023-04-06 04:10:04,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/38cd262ae84cacf7a9927c8c7aca1927.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Java Stream函数式编程管道流结果处理.doc
本文 PDF 下载地址:Java Stream函数式编程管道流结果处理.pdf
留言与评论(共有 0 条评论) |