You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
            });
  1. 语法错误:/str.add(...) 多了一个斜杠,应改为str.add(...)
  2. 重复覆盖属性:每次循环都执行document.setCstmrCdtTrfInitn(cs),最终document只会保留最后一次循环的内容
  3. 对象复用风险:cs作为复用对象,若未正确重置状态,会导致属性累积或污染
  4. 无效代码:注释掉的内层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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:10:32