如何基于Java Stream API实现StepResponse到StepResponseNew的数据迁移
实体类定义
StepResponseNew.java
step_response_new_id -- 主键 tag_record_id -- 外键 step_name step_value comments ..
StepResponse.java
step_response_id -- 主键 parent_id -- 外键 step_name step_value comments ..
TagRecordsEntity.java
tag_records_id -- 主键 parent_id -- 外键 ..
需求与现有实现
需要将StepResponse中的数据迁移至StepResponseNew,两者仅前两个属性不同。目前已通过Java Stream API将StepResponse列表按parent_id分组为Map:
Map<Long, List<StepResponse>> stepEntityMap = stepResponseList.stream() .collect(Collectors.groupingBy(StepResponse::getStepId));
同时已获取TagRecordsEntity列表:
List<TagRecordsEntity> tagRecordsEntityList = recordsRepository.findAll();
问题
现在需要遍历tagRecordsEntityList,当其中的parent_id存在于stepEntityMap的键中时,获取对应的tag_record_id,并将StepResponse的属性赋值给StepResponseNew,求具体实现方法。
实现方案
常规循环实现
// 存储转换后的StepResponseNew对象 List<StepResponseNew> stepResponseNewList = new ArrayList<>(); for (TagRecordsEntity tagRecord : tagRecordsEntityList) { Long parentId = tagRecord.getParentId(); // 匹配parent_id对应的StepResponse列表 if (stepEntityMap.containsKey(parentId)) { Long tagRecordId = tagRecord.getTagRecordsId(); // 逐个转换StepResponse为StepResponseNew for (StepResponse stepResponse : stepEntityMap.get(parentId)) { StepResponseNew newEntity = new StepResponseNew(); // 复制共同属性 newEntity.setStepName(stepResponse.getStepName()); newEntity.setStepValue(stepResponse.getStepValue()); newEntity.setComments(stepResponse.getComments()); // 设置StepResponseNew专属外键 newEntity.setTagRecordId(tagRecordId); // 其他属性按需补充赋值 stepResponseNewList.add(newEntity); } } } // 后续可批量保存到数据库 // stepResponseNewRepository.saveAll(stepResponseNewList);
Stream API简化实现
如果偏好流式写法,也可以用Stream API完成转换:
List<StepResponseNew> stepResponseNewList = tagRecordsEntityList.stream() // 过滤出有对应StepResponse数据的TagRecordsEntity .filter(tagRecord -> stepEntityMap.containsKey(tagRecord.getParentId())) // 展开每个TagRecordsEntity对应的StepResponse列表并转换 .flatMap(tagRecord -> { Long tagRecordId = tagRecord.getTagRecordsId(); return stepEntityMap.get(tagRecord.getParentId()).stream() .map(stepResponse -> { StepResponseNew newEntity = new StepResponseNew(); newEntity.setTagRecordId(tagRecordId); newEntity.setStepName(stepResponse.getStepName()); newEntity.setStepValue(stepResponse.getStepValue()); newEntity.setComments(stepResponse.getComments()); // 其他属性赋值 return newEntity; }); }) .collect(Collectors.toList());
内容的提问来源于stack exchange,提问作者user8401182
相关产品推荐
相关产品推荐

