基础
Student::name // 学生的name属性 也就是 student.getName()
x -> x // 创建对象,后面streams会大量出现
streams
以map为例子,对象的话可以用map替换,map反而是比较复杂的
list<Map>或list<实体>转map
// 筛选某个条件不为空然后转map,key是map的某个属性,值是map
List<Map<String, Object>> list = new ArrayList<>();
list.stream().filter(m -> m.get("subjectID") != null).collect(Collectors.toMap(m -> (String) m.get("subjectID"),m -> m),(oldValue, newValue) -> newValue))
提取list<Map>中的某个属性
// 根据某个条件过滤,并且提取某个属性
List listnew = list.stream().filter(m -> m.get("subjectID") != null).map(m -> (String)m.get("subjectID")).collect(Collectors.toList())
// 提取为数组
String[] codes = list.stream().map(x->x.getStudentCode()).toArray(String[]::new);
上面两个原有的实现方式
for (Map<String, Object> map : list) {
String subjectId = (String) map.get("subjectID");
if(StringUtils.isNotBlank(subjectId)){
returnMap.put((String) map.get("subjectID"),map);
subjectIdList.add(subjectId);
}
}
两个map的合并(一个map,一个是List<Map>,把list中的map提取出来合并到map)
老版本:
// 原版实现
for (Map<String, Object> map : list) {
if(map.get("subjectId") != null && !"".equals(map.get("subjectId"))){
Map<String,Object> mm = (Map<String, Object>) returnMap.get((String) map.get("subjectId"));
// 合并map
for (Map.Entry<String, Object> entry : map.entrySet()) {
if (!mm.containsKey(entry.getKey())) {
mm.put(entry.getKey(), entry.getValue());
}
}
returnMap.put((String) map.get("subjectId"),mm);
}
}
借用流
// 精简实现 借用Stream.of,先把list中的map提取出来,过滤,合并中如果重复了进行重复处理
returnMap = Stream.of(returnMap,list.stream().filter(m -> m.get("subjectId") != null).collect(Collectors.toMap(m -> (String) m.get("subjectId"), m -> m)))
.flatMap(x -> x.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> {
for (Map.Entry<String, Object> entry : ((Map<String, Object>)v2).entrySet()) {
if (!((Map<String, Object>)v1).containsKey(entry.getKey())) {
((Map<String, Object>)v1).put(entry.getKey(), entry.getValue());
}
}
return v1;
}));
根据某个属性计算数量
// 根据类型计算数量,存入map
Map<String,Long> typeMap = list.stream().collect(Collectors.groupingBy(QuestionBasketVO::getStructureType,Collectors.counting()));
根据某个属性计算数量后封装成list
// 根据题目的难度code和难度名称分类计算各自的数量后封装成前端需要的list列表
List<OverviewTypeVO> difficultList = questionBasketDOList.stream().collect(Collectors.groupingBy(x-> x.getStructureType() + "_" + x.getQuestionSource(),Collectors.counting()))
.entrySet().stream().map(x->{
// code、name、count
return OverviewTypeVO.builder().code(x.getKey().split("_")[0]).name(x.getKey().split("_")[1]).count(x.getValue().intValue()).build();
}).collect(Collectors.toList());
list = response.getData().stream().map(x->OverviewTypeVO.builder().code(x.getValue()).name(x.getName()).count(0).build()).collect(Collectors.toList());
参考资料:
Java8 Stream:2万字20个实例,玩转集合的筛选、归约、分组、聚合_云深i不知处的博客-CSDN博客_java stream 聚合 Java8 Stream