jdk8新特性 lambda Stream 学习

基础

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值