Java Stream API 操作完全攻略:让你的代码更加出色
JavaStream是一种强大的数据处理工具,可以帮助开发人员快速高效地处理和转换数据流。使用Stream操作可以大大简化代码,使其更具可读性和可维护性,从而提高开发效率。本文将为您介绍JavaStream操作的所有方面,包括groupingBy、groupingBy、joining、mapping等操作,让你的代码行云流水,更加优雅。
groupingBy:按照指定条件对Stream中的元素进行分组。
partitioningBy:按照指定条件对Stream中的元素进行分区。
joining:将Stream中的元素连接成一个字符串。
mapping:根据指定的Function对Stream中的元素进行映射,并返回一个新的Stream。
flatMapping:将每个元素映射为一个Stream,然后将这些Stream连接成一个Stream。
iterating:使用指定的种子值创建一个Stream,并依次对每个元素进行指定的操作。
empty:返回一个空的Stream。
of:根据指定的元素创建一个Stream。
concat:将多个Stream连接成一个Stream。
unordered:返回一个无序的Stream。
示例
1.使用groupingBy按照字符串长度对字符串列表进行分组
代码示例:
importjava.util.Arrays;importjava.util.List;importjava.util.Map;importjava.util.stream.Collectors;publicclassGroupingByExample{publicstaticvoidmain(String[]args){ListstringList=Arrays.asList("hello","world","java","stream");Map>result=stringList.stream.collect(Collectors.groupingBy(String::length));System.out.println(result);}}
输出结果:
2.使用partitioningBy将数字列表按照是否为偶数进行分区
代码示例:
importjava.util.Arrays;importjava.util.List;importjava.util.Map;importjava.util.stream.Collectors;publicclassPartitioningByExample{publicstaticvoidmain(String[]args){ListnumberList=Arrays.asList(1,2,3,4,5,6,7,8,9,10);Map>result=numberList.stream.collect(Collectors.partitioningBy(n->n%2==0));System.out.println(result);}}
输出结果:
3.使用joining将字符串列表中的元素用逗号连接成一个字符串
代码示例:
importjava.util.Arrays;importjava.util.List;importjava.util.stream.Collectors;publicclassJoiningByExample{publicstaticvoidmain(String[]args){ListstringList=Arrays.asList("hello","world","java","stream");Stringresult=stringList.stream.collect(Collectors.joining(","));System.out.println(result);}}
输出结果:
hello,world,java,stream
4.使用mapping将字符串列表中的元素转换为大写字母
代码示例:
importjava.util.Arrays;importjava.util.List;importjava.util.stream.Collectors;publicclassMappingByExample{publicstaticvoidmain(String[]args){ListstringList=Arrays.asList("hello","world","java","stream");Listresult=stringList.stream.map(String::toUpperCase).collect(Collectors.toList);System.out.println(result);}}
输出结果:
[HELLO,WORLD,JAVA,STREAM]
5.使用flatMapping将嵌套的字符串列表展平为一个字符串列表
代码示例:
importjava.util.Arrays;importjava.util.List;importjava.util.stream.Collectors;publicclassFlatMappingByExample{publicstaticvoidmain(String[]args){List>nestedList=Arrays.asList(Arrays.asList("hello","world"),Arrays.asList("hello","java","stream"));Listresult=nestedList.stream.flatMap(List::stream).distinct.collect(Collectors.toList);System.out.println(result);}}
输出结果:
[hello,world,java,stream]
6.使用iterating生成斐波那契数列前10项
代码示例:
importjava.util.stream.Stream;publicclassIteratingByExample{publicstaticvoidmain(String[]args){Stream.iterate(newint[]{0,1},t->newint[]{t[1],t[0]+t[1]}).limit(10).map(t->t[0]).forEach(System.out::println);}}
输出结果:
7.使用empty使用空的Stream
代码示例:
importjava.util.stream.Stream;publicclassEmptyStreamExample{publicstaticvoidmain(String[]args){StreamemptyStream=Stream.empty;System.out.println(emptyStream.count);}}
输出结果:
0
8.使用of创建包含一些字符串的Stream
代码示例:
importjava.util.stream.Stream;publicclassOfStreamExample{publicstaticvoidmain(String[]args){StreamstringStream=Stream.of("hello","world","java","stream");stringStream.forEach(System.out::println);}}
输出结果:
hello
world
java
stream
9.使用concat将两个字符串列表合并为一个列表
代码示例:
importjava.util.Arrays;importjava.util.List;importjava.util.stream.Stream;publicclassConcatStreamExample{publicstaticvoidmain(String[]args){Listlist1=Arrays.asList("hello","world");Listlist2=Arrays.asList("java","stream");Streamstream1=list1.stream;Streamstream2=list2.stream;Listresult=Stream.concat(stream1,stream2).collect(Collectors.toList);System.out.println(result);}}
输出结果:
[hello,world,java,stream]
10.使用unordered对数字列表进行排序后,使用unordered返回一个无序的Stream
代码示例:
importjava.util.Arrays;importjava.util.List;importjava.util.stream.Collectors;publicclassUnorderedStreamExample{publicstaticvoidmain(String[]args){ListnumberList=Arrays.asList(1,3,2,4,10,6,8,7,9,6);Listresult=numberList.stream.sorted.unordered.collect(Collectors.toList);System.out.println(result);}}
输出结果:
[1,2,3,4,5,6,7,8,9,10]
来个小坑
感谢大佬看到这里,如果你看完觉得没问题,那么你需要反思一下了哦。好了我们可以在仔细地看看,示例10.unordered的代码。
importjava.util.Arrays;importjava.util.List;importjava.util.stream.Collectors;publicclassUnorderedStreamExample{publicstaticvoidmain(String[]args){ListnumberList=Arrays.asList(1,3,2,4,10,6,8,7,9,6);Listresult=numberList.stream.sorted.unordered.collect(Collectors.toList);System.out.println(result);}}
输出结果:
[1,2,3,4,5,6,7,8,9,10]
执行过程分析,首先输入了一个无序的流,然后使用sorted对流进行排序,然后在使用unordered,去除流的有序约束。然后输出为List,再进行打印出来。按理来说,输出的顺序应该是一个无序的,而不是有序的。
解答
unordered操作不会执行任何操作来显式地对流进行排序。它的作用是消除了流必须保持有序的约束,从而允许后续操作使用不必考虑排序的优化。
对于顺序流,顺序的存在与否不会影响性能,只影响确定性。如果流是顺序的,则在相同的源上重复执行相同的流管道将产生相同的结果;如果是非顺序流,重复执行可能会产生不同的结果。
unordered操作,是消除了流必须保持有序的约束。并不会改变,流原有的顺序。对于并行流,放宽排序约束有时可以实现更高效的执行。在流有序时,但用户不特别关心该顺序的情况下,使用unordered明确地对流进行去除有序约束可以改善某些有状态或终端操作的并行性能。
参考
https://segmentfault.com/q/1010000017969473
结尾
如果觉得对你有帮助,可以多多评论,多多点赞哦,也可以到我的主页看看,说不定有你喜欢的文章,也可以随手点个关注哦,谢谢。
我是不一样的科技宅,每天进步一点点,体验不一样的生活。我们下期见!