Java实现列表转换:让每个Pmt对象仅含单个Transaction并替换pmtList
问题1:拆分Pmt列表,每个Pmt仅含一个Transaction
给定两个类:
public class A { String a; String b; String v; List<Pmt> pmtList; } public class Pmt { String id; String b; List<Transaction> trList; }
要实现将原pmtList转换为新列表,每个Pmt对象仅包含一个Transaction,其他属性保持不变。比如5个Pmt各含2个Transaction,转换后得到10个Pmt。
实现逻辑
遍历原列表中的每个Pmt,为其内部的每一个Transaction创建新的Pmt副本,仅将当前Transaction放入新Pmt的trList中,最后收集所有新Pmt组成列表。
代码实现
// 假设已有A类实例a List<Pmt> newPmtList = a.getPmtList().stream() .flatMap(pmt -> pmt.getTrList().stream() .map(transaction -> { // 创建新Pmt并复制原属性 Pmt newPmt = new Pmt(); newPmt.setId(pmt.getId()); newPmt.setB(pmt.getB()); // 仅放入当前单个Transaction newPmt.setTrList(Collections.singletonList(transaction)); return newPmt; }) ) .collect(Collectors.toList()); // 替换原A实例中的pmtList a.setPmtList(newPmtList);
注:如果Pmt类有全参构造方法,可直接用构造方法简化属性复制;属性较多时也可使用BeanUtils等工具类做对象拷贝,注意浅拷贝是否符合需求即可。
问题2:写回XML文档的代码可行性分析
你提供的代码思路可行,但存在若干细节问题,调整后可正常使用:
原代码问题点
q.forEach(p->{ //q.forEach(p->{ BigDecimal s = pmtInf.getSum(); short t = pmtInf.getNum(); cs.getGH().setSum(s); cs.getGH().setNum((short) t); cs.getPmt().add(p); document.setCstmrCdtTrfInitn(cs); /str.add(getJAXBObjectToXML(document, Doc.class)); cs.getPmtInf().clear(); });
- 语法错误:
/str.add(...)多了一个斜杠,应改为str.add(...) - 重复覆盖属性:每次循环都执行
document.setCstmrCdtTrfInitn(cs),最终document只会保留最后一次循环的内容 - 对象复用风险:
cs作为复用对象,若未正确重置状态,会导致属性累积或污染 - 无效代码:注释掉的内层
q.forEach无意义,建议删除
调整后的可行代码示例
// q为拆分后的Pmt列表 q.forEach(p -> { // 复用cs前先清空Pmt列表,避免累积旧数据 cs.getPmt().clear(); BigDecimal s = pmtInf.getSum(); short t = pmtInf.getNum(); cs.getGH().setSum(s); cs.getGH().setNum(t); // t本身是short,无需强制转换 cs.getPmt().add(p); // 创建新的CstmrCdtTrfInitn实例,避免复用cs导致状态污染 CstmrCdtTrfInitn newCs = new CstmrCdtTrfInitn(); newCs.setGH(new GH(cs.getGH().getSum(), cs.getGH().getNum())); // 假设GH有对应构造方法 newCs.setPmt(new ArrayList<>(cs.getPmt())); document.setCstmrCdtTrfInitn(newCs); str.add(getJAXBObjectToXML(document, Doc.class)); });
关键优化点
- 避免对象复用污染:每次循环创建新的
CstmrCdtTrfInitn实例,或确保复用对象的所有可变属性都被重置 - 修正语法错误:移除多余斜杠
- 减少不必要转换:
t本身是short类型,无需强制转换
内容的提问来源于stack exchange,提问作者user20579148
相关产品推荐
相关产品推荐

