一 引言
JAVA1.8得益于Lambda所带来的函数式编程,引入了一个全新的Stream流概念Stream流式思想类似于工厂车间的“生产流水线”,Stream流不是一种数据结构,不保存数据,而是对数据进行加工处理。Stream可以看作是流水线上的一个工序。在流水线上,通过多个工序让一个原材料加工成一个商品。
二 常用方法介绍
2.1 获取Stream流
所有的 Collection 集合都可以通过 stream 默认方法获取流;
java.util.Collection 接口中加入了default方法 stream 用来获取流,所以其所有实现类均可获取流。
1 | ArrayList<XyBug> xyBugList = new ArrayList(); |
Stream 接口的静态方法 of 可以获取数组对应的流。
1 | //String |
2.2 Stream 数据处理常用方法
forEach方法
该方法接收一个 Consumer 接口函数,会将每一个流元素交给该函数进行处理
1 | List<String> list = new ArrayList<>(); |
s代表list中的每一个元素,流式处理依次遍历每个元素
->后的代码为每个元素处理逻辑
count方法
count 方法来统计其中的元素个数,返回值为long类型
1 | long count = list.stream().count(); |
distinct方法
对流中的数据进行去重操作,普通类型可直接去重
1 | //将22、33重复数据去除 |
自定义类型是根据对象的hashCode和equals来去除重复元素的
XyBug实体类中加@Data注解,hashCode和equals会别重写,在使用distinct方法时判断去重
1 | ArrayList bugList = JSON.parseObject(bugs, ArrayList.class); |
通过distinct()方法去重,去重后的数据通过collect(Collectors.toList())组成新的list
limit方法
方法可以对流进行截取,只取用前n个,参数是一个long型,如果集合当前长度大于参数则进行截取。否则不进行操作
1 | List<String> list = new ArrayList<>(); |
将前3个String对象截取,组成新的list
skip方法
如果希望跳过前几个元素,可以使用 skip 方法获取一个截取之后的新流,如果流的当前长度大于n,则跳过前n个;否则将会得到一个长度为0的空流
1 | List<String> list = new ArrayList<>(); |
跳过前3个String对象,后三个组成新的list
filter方法
filter用于过滤数据,返回符合过滤条件的数据,可以通过 filter 方法将一个流转换成另一个子集流,该接口接收一个 Predicate 函数式接口参数(可以是一个Lambda或方法引用)作为筛选条件
1 | List<String> list = new ArrayList<>(); |
通过该条语句s -> s.length() == 2,筛选出22、55
map方法
将流中的元素映射到另一个流中,可以将当前流中的T类型数据转换为另一种R类型的流
1 | List<PersonCrDto> laputaCrDtos = queryListLaputaByBeginEndTime(begin, end); |
将list中的每个对象的userName数据拿到,组成Set集合
stream分组
1 | List<XyBug> list = new ArrayList<>(); |
根据bug类型进行分组,分组后会组成map,key是组名,value是组下的数据
stream排序
sort(),默认正序排列,加入reversed()方法后倒叙排列
1 | List<XyBug> list = new ArrayList<>(); |
collect方法
将处理后数据收集为list,collect(Collectors.toList())
将处理后数据收集为set,collect(Collectors.toSet())
根据某个字段值将数据分组map,collect(Collectors.groupingBy(o -> o.value())))
三 实践举例
需求:将bug数据通过orgTierName分组,存储到map中
未使用Stream,需要使用for循环并且进行各种判断,代码行数较多
1 | HashMap<String, List<XyBug>> map = new HashMap<>(); |
使用Stream,一行代码搞定,直观并高效
1 | collectDeptBugMap = bugList.stream().filter(o -> o.getOrgTierName() != null).collect(Collectors.groupingBy(o -> o.getOrgTierName())); |