迭代列表时若personAccountable有多对象如何创建多个PersonStackBuilder实例
实现方案
核心逻辑
- 放弃原逻辑中单resp对应单PersonStackBuilder的结构,改为单Accountable元素对应单PersonStackBuilder
- 每个PersonStackBuilder的公共属性(personID、personAreaCode等)统一从resp中读取复用
- 每个实例的关联属性(personMortgageId等)从对应Accountable元素读取
完整实现代码
List<PersonInfo> personInfo = new ArrayList<>(); myResponseList.forEach(resp -> { List<Accountable> accountableList = resp.getPersonAccountable(); // 可选兼容逻辑:如果需要Accountable列表为空时,保留1条只有基础属性的记录,可打开下方注释 // if (CollectionUtils.isEmpty(accountableList)) { // PersonStackBuilder person = new PersonStackBuilder(); // person.setPersonID(resp.getProjectID()); // person.setPersonAreaCode(resp.getPersonAreaCode()); // // 其他基础属性赋值 // personInfo.add(person); // return; // } // 遍历每个Accountable元素,对应生成一个独立的PersonStackBuilder实例 accountableList.forEach(acc -> { PersonStackBuilder person = new PersonStackBuilder(); // 赋值公共基础属性 person.setPersonID(resp.getProjectID()); person.setPersonAreaCode(resp.getPersonAreaCode()); // 其他和resp关联的基础属性赋值 // ... // 赋值当前Accountable对应的独有属性 person.setPersonMortgageId(acc.getMortId()); // 其他和acc关联的属性赋值 // ... personInfo.add(person); }); });
可选优化
如果使用JDK8+ stream写法,可以替换为flatMap批量收集结果,代码更简洁:
List<PersonInfo> personInfo = myResponseList.stream() .flatMap(resp -> resp.getPersonAccountable().stream() .map(acc -> { PersonStackBuilder person = new PersonStackBuilder(); person.setPersonID(resp.getProjectID()); person.setPersonAreaCode(resp.getPersonAreaCode()); person.setPersonMortgageId(acc.getMortId()); // 其他属性赋值 return person; })) .toList(); // JDK16以下版本替换toList()为.collect(Collectors.toList())
内容的提问来源于stack exchange,提问作者user222
相关产品推荐
相关产品推荐

