迭代ArrayList时如何根据另一对象列表校验结果更新实体值
需求可以直接实现,你需要的isComplete字段赋值逻辑可以通过Java 8 Stream的allMatch方法完成,刚好匹配「所有字段都满足条件才返回true」的要求。
修改后的完整转换方法
public static List<DestDO> mapSourceToDest(List<SourceDO> listOfSourceObj){ List<DestDO> desiredResult = new ArrayList<>(); for(SourceDO sourceDo : listOfSourceObj){ // 校验所有字段非空非null boolean completeFlag = Stream.of( sourceDo.getId(), sourceDo.getName(), sourceDo.getPhase(), sourceDo.getAttr() ) .allMatch(field -> field != null && !field.isEmpty()); desiredResult.add(DestDO.builder() .id(Optional.ofNullable(sourceDo.getId()).orElse("")) .name(Optional.ofNullable(sourceDo.getName()).orElse("")) .phase(Optional.ofNullable(sourceDo.getPhase()).orElse("")) .attr(Optional.ofNullable(sourceDo.getAttr()).orElse("")) .isComplete(String.valueOf(completeFlag)) .build()); // 注意原代码漏了build()调用,需补上 } return desiredResult; }
逻辑说明
- 把SourceDO需要校验的四个字段全部放入Stream流中
- 调用
allMatch方法做统一校验:只有所有字段都满足「不为null且不为空字符串」的条件,才会返回true,任意字段不满足直接返回false - 因为你当前DestDO的isComplete字段是String类型,所以用
String.valueOf把布尔值转成字符串存入即可,如果你后续把isComplete改成boolean类型,直接赋值completeFlag即可。
如果想要代码更简洁,也可以把校验逻辑直接写到builder的isComplete方法里,不用单独声明变量:
.isComplete(String.valueOf(Stream.of(sourceDo.getId(), sourceDo.getName(), sourceDo.getPhase(), sourceDo.getAttr()) .allMatch(field -> field != null && !field.isEmpty())))
内容的提问来源于stack exchange,提问作者Jeet
相关产品推荐
相关产品推荐

