Java Stream 集合运算(交集、差集、并集)、多条件过滤集合方法业务实现单按钮操作[添加、更新、删除]

使用场景

我们在实际实现功能的开发过程之中,出现在一个前端页面的按钮上实现,在一个接口之中对数据 进行编辑、新增、删除 等相关操作。
在这里插入图片描述
此时的功能页面操作一个操作【确认】按钮,实际在后端的实现过程包含以下操作内容:

  1. 在课程设置分数等级后,又增加一个一个等级制 【新增操作
  2. 在已经设置权重可能在前端移除 【删除操作
  3. 更改改了里面某些属性值如 等级名称、等级最小起始值 【更新操作

于是需要在一个后端操作接口之中,实现对数据同时进行三种操作【 新增、更新、删除

代码实现逻辑及内容

  • 获得前端回传数据到后端(包含 新增、 编辑、删除记录[已不在回传数据之中])
  • 通过参数查询数据库之中,原来包含所有 有效权重记录
  • 通过集合运算【新增、编辑、删除记录】
    - clientList — dbList 差集 新增记录【前端回传有,数据库之中没有】
    - clientList — dbList 交集 更新记录【两者都有的公共部分】
    - dbList — clientList 差集 删除记录【数据库有但是前端没有的】
    注意事项:在实际业务之中比较计算 可能涉及多个字段组合比较。
           // 前端回传等级规则List --- dbGradeScoreRuleList   差集  属于新增内容
           // 注释重要说明: 为了区分是否是新增记录 用max+@##@+minx+@##@+grade等级组合判断是否相等
           List<GradeRuleVO> addGradeScoreRuleList = clientGradeScoreRuleList.stream()
                   .filter(gradeRule -> !dbGradeScoreRuleList.stream().map(dbGradeRule -> dbGradeRule.getMax() + "@##@" + dbGradeRule.getMin() + "@##@" + dbGradeRule.getGrade())
                           .collect(Collectors.toList()).contains(gradeRule.getMax() + "@##@" + gradeRule.getMin() + "@##@" + gradeRule.getGrade()))
                   .collect(Collectors.toList());
           if (addGradeScoreRuleList.size() > 0) {
               List<GradeRuleDTO> addGradeRuleList = new ArrayList<>();
               for (GradeRuleVO gradeRuleVO : addGradeScoreRuleList) {
                   GradeRuleDTO gradeRuleDTO = new GradeRuleDTO();
                   BeanUtils.copyProperties(gradeRuleVO, gradeRuleDTO);
                   gradeRuleDTO.setClazzId(clazzId);
                   gradeRuleDTO.setCourseId(courseId);
                   gradeRuleDTO.setCreateBy(operateUserId);
                   gradeRuleDTO.setCreateTime(operateTime);
                   gradeRuleDTO.setUpdateBy(operateUserId);
                   gradeRuleDTO.setUpdateTime(operateTime);
                   addGradeRuleList.add(gradeRuleDTO);
               }
               clazzCourseWeightExtendMapper.addBatchCourseGradeScoreRuleList(addGradeRuleList);
           }

           //2.2、更新班级课程等级评分规则
           // 前端回传等级规则List --- dbGradeScoreRuleList   交集  属于更新内容
           List<GradeRuleVO> updateGradeScoreRuleList = clientGradeScoreRuleList.stream()
                   .filter(gradeRule -> dbGradeScoreRuleList.stream().map(GradeRuleVO::getId)
                           .collect(Collectors.toList()).contains(gradeRule.getId()))
                   .collect(Collectors.toList());
           if (updateGradeScoreRuleList.size() > 0) {
               List<GradeRuleDTO> updateGradeRuleList = new ArrayList<>();
               for (GradeRuleVO gradeRuleVO : updateGradeScoreRuleList) {
                   GradeRuleDTO gradeRuleDTO = new GradeRuleDTO();
                   BeanUtils.copyProperties(gradeRuleVO, gradeRuleDTO);
                   gradeRuleDTO.setUpdateBy(operateUserId);
                   gradeRuleDTO.setUpdateTime(operateTime);
                   updateGradeRuleList.add(gradeRuleDTO);
               }
               clazzCourseWeightExtendMapper.updateBatchCourseGradeScoreRuleList(updateGradeRuleList);
           }
           //2.3、删除前端去掉的评分规则
           // dbGradeScoreRuleList---前端回传等级规则List   差集  属于删除内容
           List<GradeRuleVO> deleteGradeScoreRuleList = dbGradeScoreRuleList.stream()
                   .filter(gradeRule -> !clientGradeScoreRuleList.stream()
                           .map(clientGradeRule -> clientGradeRule.getMax() + "@##@" + clientGradeRule.getMin() + "@##@" + clientGradeRule.getGrade())
                           .collect(Collectors.toList()).contains(gradeRule.getMax() + "@##@" + gradeRule.getMin() + "@##@" + gradeRule.getGrade()))
                   .collect(Collectors.toList());

           if (deleteGradeScoreRuleList.size() > 0) {
               List<Long> deleteIdList = deleteGradeScoreRuleList.stream().map(GradeRuleVO::getId).collect(Collectors.toList());
               Map<String, Object> removeParams = new HashMap<>(8);
               removeParams.put("operateTime", operateTime);
               removeParams.put("operateUserId", operateUserId);
               removeParams.put("gradeRuleIdList", deleteIdList);
               clazzCourseWeightExtendMapper.removeBatchCourseGradeScoreRuleList(removeParams);
           }

List Stream多条件过滤

目前网上大部分文章都是如何实现单条件实现,一般是通过单条件过滤某个Bean或者Map之中的属性值如:

List<User> userList = list.stream().filter(u->u.getGender().equals("1")).collect(Collectors.toList());

实际情况可能有多条件过滤(如果性别和出生籍贯等):

List<User> userList = list.stream().filter(s->s.getGender().equals("1")
    &&s.getCity().equals("北京市")).collect(Collectors.toList());

甚至更有甚者,我们业务之中需要用到分类+某一类别的主键id于是有如下情况:

// 交集
List<User> userList = list.stream()
    .filter(user1 -> list2.stream().map(user2 -> user2.getCity() + "&" + user2.getName())
    .collect(Collectors.toList()).contains(user1.getCity()+ "&" + user1.getName()))
	//.filter(user1 -> list2.stream().map(User::getName)
	//.collect(Collectors.toList()).contains(user1.getName()))
    .collect(Collectors.toList());

比如我的实际业务之中就需要通过 最大值+最小值+等级以前进行区分

参考文章

Java stream().filter()筛选出符合条件的数据
两个List对象多属性去重、交集、差集
Java8 Stream 实现复杂集合对象的差集、并集、交集
java8 stream两个集体交集、差集、并集操作
JDK8 Stream 流让代码干净、简洁、高效
Stream的各类型求和
Java Stream流之求和的实现

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值