Java8 Stream中间操作实例解析
这篇文章主要介绍了Java8Stream中间操作实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
介绍Stream
Stream使用一种类似用于SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象。StreamAPI可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如筛选,排序,聚合等。
Stream两种操作
中间操作(IntermediateOperations):中间操作会返回一个新的流,一个流可以后面跟随零个或多个intermediate操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后会返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历。而是在终端操作开始的时候才真正开始执行。
终端操作(TerminalOperations):是指返回最终的结果。一个流只能有一个terminal操作,当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作。Terminal操作的执行,才会真正开始流的遍历,并且会生成一个结果,或者一个sideeffect。
中间操作方法分类:
- filter()
- map()
- flatMap()
- distinct()
- sorted()
- peek()
- limit()
- skip()
终端操作方法分类:
- forEach()
- forEachOrdered()
- toArray()
- reduce()
- collect()
- min()
- max()
- count()
- anyMatch()
- allMatch()
- noneMatch()
- findFirst()
- findAny()
中间操作代码实例详解
1、filter():返回结果生成新的流中只包含满足筛选条件的数据。
//1、filter,返回大于2的元素集合 Listnums=Arrays.asList(1,2,3,4,5); List result=nums.stream().filter(n->n>2).collect(Collectors.toList()); System.out.println(result);
运行结果:[3,4,5]
2、map():将流中的元素进行再次加工形成一个新流,流中的每一个元素映射为另外的元素。
//2、map:返回元素的大写类型和哈希值 Listmzc=Arrays.asList("ma","zhi","chu"); List mzcUpperCase=mzc.stream(). map(n->n.toUpperCase()). collect(Collectors.toList()); List mzcHashCode=mzc.stream().map(n->n.hashCode()).collect(Collectors.toList()); System.out.println("mzcUpperCase:"+mzcUpperCase+"-----mzcHashCode:"+mzcHashCode);
运行结果:
mzcUpperCase:[MA,ZHI,CHU]-----mzcHashCode:[3476,120571,98480]
示例场景:取出商品的所有id,就可以这样写(伪代码):
List
List
这样就可以拿到所有商品id的集合。
3、flatMap():扁平化映射,它具体的操作是将多个stream连接成一个stream,这个操作是针对类似多维数组的,比如集合里面包含集合,相当于降维作用。
flatMap是将流中的每个元素都放到一个流中,最后将所有的流合并成一个新流,所有流对象中的元素都合并到这个新生成的流中返回。
//flatMap:将多层集合中的元素取出来,放到一个新的集合中去 Listnum1=Arrays.asList(1,2,3); List num2=Arrays.asList(4,5,6); List num3=Arrays.asList(7,8,9); List >lists=Arrays.asList(num1,num2,num3); Stream
outputStream=lists.stream().flatMap(l->l.stream()); List flatMapResult=outputStream.sorted().collect(Collectors.toList()); System.out.println(flatMapResult);
运行结果:[1,2,3,4,5,6,7,8,9]
示例场景:取出所有部门人员的姓名,就可以这样写(伪代码):
//1、取出所有部门
List
//2、这个时候可以利用flatMap先将所有部门的所有人员汇聚起来
List
//3、再利用map()方法取出
4、distinct():顾名思义,将流中的元素去重之后输出。
Listmzc=Stream.of("ma","zhi","chu","zhi","shuo","ma") .distinct() .collect(Collectors.toList()); System.out.println(mzc);
运行结果:[ma,zhi,chu,shuo]
5、sorted():这个很简单了,顾名思义,将流中的元素按照自然排序方式进行排序。
//sorted:自然顺序排序 Listnums=Arrays.asList(1,3,5,6,8,2); List sortedNum=nums.stream().sorted().collect(Collectors.toList()); System.out.println(sortedNum); //sorted:降序排序 List sortedNum2=nums.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList()); System.out.println(sortedNum2); //sorted:使用Comparator List sortedNums3=nums.stream().sorted(Comparator.comparing(n->n)).collect(Collectors.toList()); System.out.println(sortedNums3); //不用stream直接顺序排序 nums.sort(Comparator.comparing(Integer::intValue)); System.out.println(nums); //不用stream直接降序排序 nums.sort(Comparator.comparing(Integer::intValue).reversed()); System.out.println(nums);
运行结果:
[1,2,3,5,6,8]
[8,6,5,3,2,1]
[1,2,3,5,6,8]
[1,2,3,5,6,8]
[8,6,5,3,2,1]
6、peek():对流中每个元素执行操作,并返回一个新的流,返回的流还是包含原来流中的元素。
//peek(): String[]arr=newString[]{"a","b","c","d"}; Arrays.stream(arr) .peek(System.out::println)//a,b,c,d .count(); //peek()+filter() Stream.of("ma","zhi","chu") .filter(e->e.length()>2) .peek(e->System.out.println(e)) .collect(Collectors.toList());
运行结果:
a
b
c
d
zhi
chu
7、limit():顾名思义,返回指定数量的元素的流。返回的是Stream里前面的n个元素。
//limit():取出100中的前十个 ListlimitNum=IntStream.range(1,100).limit(10) .boxed() .collect(Collectors.toList()); System.out.println(limitNum); //limit():取出前4个单词 List words=Arrays.asList("ma","zhi","chu","wait","you","follow"); List limitWord=words.stream().limit(4).collect(Collectors.toList()); System.out.println(limitWord);
运行结果:
[1,2,3,4,5,6,7,8,9,10]
[ma,zhi,chu,wait]
8、skip():和limit()相反,将前几个元素跳过(取出)再返回一个流,如果流中的元素小于或者等于n,就会返回一个空的流。
//skip():跳过前面三个单词再返回 Listwords=Arrays.asList("ma","zhi","chu","wait","you","follow"); List skipWord=words.stream().limit(4).collect(Collectors.toList()); System.out.println(skipWord); //skip():跳过全部单词再返回 List emptyWord=words.stream().skip(6).collect(Collectors.toList()); System.out.println(emptyWord); //skip():跳过超过单词长度的数目再返回 List emptyWord2=words.stream().skip(10).collect(Collectors.toList()); System.out.println(emptyWord);
运行结果:
[91,92,93,94,95,96,97,98,99]
[ma,zhi,chu,wait]
[]
[]
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。