建设网站怎样分配给用户空间,营销手机都有什么功能啊,广西住房和城乡建设厅网站,安徽鹏华建设工程有限公司网站Java Stream管道流是用于简化集合类元素处理的java API。 在使用的过程中分为三个阶段#xff1a;
将集合、数组、或行文本文件转换为java Stream管道流管道流式数据处理操作#xff0c;处理管道中的每一个元素。上一个管道中的输出元素作为下一个管道的输入元素。管道流结果…Java Stream管道流是用于简化集合类元素处理的java API。 在使用的过程中分为三个阶段
将集合、数组、或行文本文件转换为java Stream管道流管道流式数据处理操作处理管道中的每一个元素。上一个管道中的输出元素作为下一个管道的输入元素。管道流结果处理操作
我之前写过的一个例子 ListString nameStrs Arrays.asList(Monkey, Lion, Giraffe,Lemur);ListString 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]
1、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方法则无法保证这个顺序MonkeyLionGiraffeLemurLion
2、元素的收集collect
java Stream 最常见的用法就是一将集合类转换成管道流二对管道流数据处理三将管道流处理结果在转换成集合类。那么collect()方法就为我们提供了这样的功能将管道流处理结果在转换成集合类。
转换为Set SetString collectToSet Stream.of(Monkey, Lion, Giraffe, Lemur, Lion) .collect(Collectors.toSet());
最终collectToSet 中的元素是:[Monkey, Lion, Giraffe, Lemur]因为Set会去重。
转换为List ListString collectToList Stream.of(Monkey, Lion, Giraffe, Lemur, Lion).collect(Collectors.toList());
通用的转换方式
上面的元素转换方式都是专用的。比如使用Collectors.toSet()收集为Set类型集合使用Collectors.toList()收集为List类型集合。那么有没有一种比较通用的数据元素收集方式将数据收集为任意的Collection接口子类型。 所以这里介绍一种通用的元素收集方式你可以将数据元素收集到任意的Collection类型即向所需Collection类型提供构造函数的方式。
例如 LinkedListString collectToCollection Stream.of(Monkey, Lion, Giraffe, Lemur, Lion).collect(Collectors.toCollection(LinkedList::new));
最终collectToCollection中的元素是: [Monkey, Lion, Giraffe, Lemur, Lion]
转换为Array
通过toArray(String[]::new)方法收集Stream的处理结果将所有元素收集到字符串数组中。 String[] toArray Stream.of(Monkey, Lion, Giraffe, Lemur, Lion) .toArray(String[]::new);
转换为Map
使用Collectors.toMap()方法将数据元素收集到Map里面但是出现一个问题那就是管道中的元素是作为key还是作为value。我们用到了一个Function.identity()方法该方法很简单就是返回一个“ t - t ”输入就是输出的lambda表达式。另外使用管道流处理函数distinct()来确保Map键值的唯一性。 MapString, Integer toMap Stream.of(Monkey, Lion, Giraffe, Lemur, Lion).distinct().collect(Collectors.toMap(Function.identity(), //元素输入就是输出作为keys - (int) s.chars().distinct().count()// 输入元素的不同的字母个数作为value));// 最终toMap的结果是: {Monkey6, Lion4, Lemur5, Giraffe6}
分组转换groupingBy
Collectors.groupingBy用来实现元素的分组收集下面的代码演示如何根据首字母将不同的数据元素收集到不同的List并封装为Map。 MapCharacter, ListString 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() 结果是: {G1, L3, M1}
这是该过程的说明groupingBy第一个参数作为分组条件第二个参数是子收集器。
3、其他常用方法 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{count3, sum6, min1, average2.000000, max3}