java stream接口,java stream源码分析

  java stream接口,java stream源码分析

  00-1010一、JavaStream流水线数据处理操作二。ForEach和ForEachOrdered III。元素集合collect3.1 .集合为Set3.2 .集合为List3.3 .通用集合方法3.4。集合为数组3.5。集合为映射3.6。分组方式4。其他常用方法

  00-1010在这个数字之前写的文章里,我曾经介绍过Java Stream pipeline stream是一个java API,用来简化集合类元素的处理。使用过程有三个阶段。在开始这篇文章之前,我觉得还是有必要把这三个阶段介绍给一些新朋友,如下图所示:

  第一阶段(图中蓝色):将集合、数组或行文本文件转换成java Stream管道流。第二阶段(图中虚线):流水线流式数据处理操作,处理流水线中的每一个元素。前一个管道的输出元素被用作下一个管道的输入元素。第三阶段(图中绿色):流水线流程结果处理操作,这是本文的核心内容。在我们开始学习之前,还是有必要回顾一下我们之前给大家讲过的一个例子:

  ListString nameStrs=arrays . aslist(猴子,狮子,长颈鹿,狐猴);ListString list=nameStrs.stream()。筛选器(s - s.startsWith(L ))。映射(String:toUpperCase)。已排序()。collect(to list());system . out . println(list);首先,使用Stream()方法将字符串列表转换为管道流。

  然后,执行流水线数据处理操作。首先使用fliter函数过滤所有以大写L开头的字符串,然后将管道中的字符串转换成大写字母toUpperCase,再调用sorted方法进行排序。在前一篇文章中已经介绍了这些API的用法。还使用了Lambda表达式和函数引用。

  最后,使用collect函数处理结果,并将java Stream管道流转换为列表。list的最终输出是:[狐猴,狮子]

  如果不使用java Stream pipeline flow,想想完成以上功能需要多少行代码。回到正题,本文就是给大家介绍第三个阶段:对流水线流程处理结果能做什么?我们开始吧!

  00-1010如果只想打印出Stream管道流的处理结果而不是类型转换,可以使用forEach()方法或forEachOrdered()方法。

  (猴子,狮子,长颈鹿,狐猴,狮子)。平行()。forEach(system . out :3360 println);(猴子,狮子,长颈鹿,狐猴,狮子)。平行()。foreach ordered(system . out :3360 println);parallel()函数表示并行处理流水线中的元素,而不是串行处理,这样处理速度更快。但是,这可能会导致管道流中后面的元素先处理,前面的元素后处理,即无法保证元素的顺序。

  ForEachOrdered从名字就可以理解。虽然可能无法保证数据处理的顺序,但forEachOrdered方法可以确保元素输出的顺序与元素进入管道流的顺序一致。就是下面这个样子(forEach方法不能保证这个顺序):

  猴子长颈鹿

  

目录

java Stream最常见的用法是:一是将集合类转换成管道流,二是处理管道流数据,三是将管道流处理结果转换成集合类。那么collect()方法为我们提供了将管道流的处理结果转换成集合类的功能。

 

  00-1010通过Collectors.toSet()方法收集Stream的处理结果,将所有元素收集到Set集合中。

  SetString collectToSet=stream . of(猴子,狮子,长颈鹿,狐猴,狮子)。收集(

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

 

  

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}

这是该过程的说明:groupingBy第一个参数作为分组条件,第二个参数是子收集器。

 

  

 

  

四、其他常用方法

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().orElse(0);//管道中元素数据最大值max: 3IntSummaryStatistics statistics = IntStream.of(1, 2, 3).summaryStatistics();// 全面的统计结果statistics: IntSummaryStatistics{count=3, sum=6, min=1, average=2.000000, max=3}

以上就是java理论基础Stream API终端操作示例解析的详细内容,更多关于java Stream API终端操作的资料请关注盛行IT其它相关文章!

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: