前言
上篇文章我们介绍了Stream流的最终操作!
- 两篇博客带你搞定Java8 Stream操作 第一篇
接下来,我们继续了解一下Stream的中间操作!
中间操作
Filter操作
通过名字,我们就能知道,filter是用于过滤的。通过自定义过滤条件,就可以根据条件对流中的元素进行相应的过滤操作!
//过滤出成绩大于99的人的集合
List<Person> collect = s.filter(person -> person.getScole() > 99).collect(Collectors.toList());
System.out.println(collect);
Distinct去重
distinct操作可以帮助我们快速去除集合中的重复元素,distinct的去重规则如下
- 先判断 hashCode()
- 再判断 equals()
只有两个条件都满足了,才会被认定为重复元素,进行去重
List<Person> collect1 = s.distinct().collect(Collectors.toList());
sorted排序
sorted方法可以对流中元素进行排序。
他有两个方法:
- 无参方法:需要对流中元素对应的类实现comparable接口,指定比较规则
- 有参方法:直接在参数中指定比较规则
s.sorted((ele1,ele2)->ele1.getAge()-ele2.getAge()).forEach(System.out::println);
limit
只取流中前指定为的元素
s.limit(3).forEach(System.out::println);
//输出集合中前三条元素
skip
跳过流中的元素,获取剩下的元素
s.skip(3).forEach(System.out::println);
//跳过集合中前三条数据,打印剩下的元素
map
map方法是将指定的Stream中元素进行“平级”处理,每个元素转化为各自所对应的一个Stream集合
//这里展示一下我在公司项目中用到的
//将这个集合中的procInstId转换为一个数组
String[] procInstIds = punchResultEntityList.stream()
.map(approvalList -> approvalList.getProcInstId())
.collect(Collectors.toList()).toArray(new String[punchResultEntityList.size()]);
//map操作可以做很多的事情
//map的操作语句可以加上大括号后,就可以写多行语句了!但是写成如下格式后,需要有返回值;也就是return语句
String[] procInstIds = punchResultEntityList.stream()
.map(approvalList ->{
approvalList.getProcInstId();
return approvalList;
} )
.collect(Collectors.toList()).toArray(new String[punchResultEntityList.size()]);
在很多时候我们只是想对集合中的某个元素进行某种操作,不需要返回什么,所以这个时候,就可以用peek操作代替map操作!
//peek操作是不需要返回值的
String[] procInstIds = punchResultEntityList.stream()
.peek(approvalList ->{
approvalList.getProcInstId();
} )
.collect(Collectors.toList()).toArray(new String[punchResultEntityList.size()]);
stream扩展
将数组转换为流
String[] players={"1","2","3","4"};
Stream.of(players).filter().collect(Collectors.toList());
将文件中的元素转换为流
有一个文本类型的文件,
file.txt
1
2
3
4
Stream<String> fileStream=files.lines(Path.get("file.txt");
List<String> list=fileStream.collect(Collectors.tolist());
Stream中间操作分为一下两种:
- 无状态操作
- filter
- map
- flatmap
- 有状态操作
- distinct
- limit
- skip
- sorted
Stream也可以实现并发操作,那就是使用并行流!
s.stream.parallel().map();
在面对大量的数据的时候,我们可以使用并行流极大的加快流的处理速度。
但是并不是所有的操作都适合使用并行流。
并行流的操作会影响有状态的操作。
并行流非常适合处理一下几种类型的数据:
- ArrrayLists
- HashMaps
- PlainArrays
Stream流极大的简化了我们的代码,让我们的代码看起来更加优雅,但是stream相比于for循环在性能上表现又如何呢?
并行流>>stream约等于for循环
甚至对于某些数据类型,stream的效率要高于for循环!所以大家可以放心的使用了!