使用场景
我们在实际实现功能的开发过程之中,出现在一个前端页面的按钮上实现,在一个接口之中对数据 进行编辑、新增、删除 等相关操作。
此时的功能页面操作一个操作【确认】按钮,实际在后端的实现过程包含以下操作内容:
- 在课程设置分数等级后,又增加一个一个等级制 【新增操作】
- 在已经设置权重可能在前端移除 【删除操作】
- 更改改了里面某些属性值如 等级名称、等级最小起始值 【更新操作】
于是需要在一个后端操作接口之中,实现对数据同时进行三种操作【 新增、更新、删除 】
代码实现逻辑及内容
- 获得前端回传数据到后端(包含 新增、 编辑、删除记录[已不在回传数据之中])
- 通过参数查询数据库之中,原来包含所有 有效权重记录
- 通过集合运算【新增、编辑、删除记录】
- 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流之求和的实现