Java中如何对Trade列表进行深度拆分与递归处理

来源:建站作者:厦门程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《Java中如何对Trade列表进行深度拆分与递归处理》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Java中如何对Trade列表进行深度拆分与递归处理》有用,将其分享出去将是对创作者最好的鼓励。

在Java开发中,Trade类经常包含子Trade的嵌套结构,比如订单交易中主交易下挂多个子交易,子交易还能继续嵌套更细粒度的交易数据。这种情况下需要对Trade列表做深度拆分,把不同层级的Trade提取出来分别处理,递归是最适配的实现方式。

Java中如何对Trade列表进行深度拆分与递归处理

Trade类基础结构定义

首先定义基础的Trade类,包含交易ID、交易金额、子交易列表三个核心属性,这是后续拆分处理的基础:

public class Trade {
    private String tradeId;
    private double amount;
    private List<Trade> subTrades;

    public Trade(String tradeId, double amount, List<Trade> subTrades) {
        this.tradeId = tradeId;
        this.amount = amount;
        this.subTrades = subTrades;
    }

    // getter和setter方法
    public String getTradeId() {
        return tradeId;
    }

    public void setTradeId(String tradeId) {
        this.tradeId = tradeId;
    }

    public double getAmount() {
        return amount;
    }

    public void setAmount(double amount) {
        this.amount = amount;
    }

    public List<Trade> getSubTrades() {
        return subTrades;
    }

    public void setSubTrades(List<Trade> subTrades) {
        this.subTrades = subTrades;
    }
}

深度拆分与递归处理核心逻辑

深度拆分的核心是通过递归遍历所有层级的Trade,把每一层的Trade都收集到结果列表中,同时可以根据业务需求对每层数据做处理。递归的终止条件是当前Trade没有子交易列表,或者子交易列表为空。

递归拆分方法实现

下面的方法接收原始Trade列表,返回拆分后所有层级的Trade扁平列表:

import java.util.ArrayList;
import java.util.List;

public class TradeSplitUtil {

    /**
     * 深度拆分Trade列表,返回所有层级的Trade集合
     * @param tradeList 原始Trade列表,可能包含多层嵌套
     * @return 拆分后扁平化的Trade列表
     */
    public static List<Trade> deepSplitTradeList(List<Trade> tradeList) {
        List<Trade> result = new ArrayList<>();
        // 递归处理入口
        deepSplitRecursive(tradeList, result);
        return result;
    }

    /**
     * 递归处理核心方法
     * @param currentTrades 当前层级的Trade列表
     * @param result 存储拆分结果的集合
     */
    private static void deepSplitRecursive(List<Trade> currentTrades, List<Trade> result) {
        // 空值校验,避免空指针异常
        if (currentTrades == null || currentTrades.isEmpty()) {
            return;
        }
        for (Trade trade : currentTrades) {
            // 把当前层的Trade加入结果集
            result.add(trade);
            // 获取子交易列表
            List<Trade> subTrades = trade.getSubTrades();
            // 如果存在子交易,递归处理子交易
            if (subTrades != null && !subTrades.isEmpty()) {
                deepSplitRecursive(subTrades, result);
            }
        }
    }
}

带层级标识的拆分实现

如果业务需要区分不同层级的Trade,可以在递归时传递层级参数,把层级信息保存到扩展的TradeVO中:

public class TradeVO {
    private String tradeId;
    private double amount;
    private int level; // 交易所在层级,根层级为0

    public TradeVO(String tradeId, double amount, int level) {
        this.tradeId = tradeId;
        this.amount = amount;
        this.level = level;
    }

    // getter和setter
    public String getTradeId() {
        return tradeId;
    }

    public void setTradeId(String tradeId) {
        this.tradeId = tradeId;
    }

    public double getAmount() {
        return amount;
    }

    public void setAmount(double amount) {
        this.amount = amount;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }
}

对应的递归处理方法调整为:

import java.util.ArrayList;
import java.util.List;

public class TradeSplitWithLevelUtil {

    public static List<TradeVO> deepSplitWithLevel(List<Trade> tradeList) {
        List<TradeVO> result = new ArrayList<>();
        deepSplitRecursiveWithLevel(tradeList, 0, result);
        return result;
    }

    private static void deepSplitRecursiveWithLevel(List<Trade> currentTrades, int currentLevel, List<TradeVO> result) {
        if (currentTrades == null || currentTrades.isEmpty()) {
            return;
        }
        for (Trade trade : currentTrades) {
            // 封装带层级的TradeVO
            TradeVO tradeVO = new TradeVO(trade.getTradeId(), trade.getAmount(), currentLevel);
            result.add(tradeVO);
            // 处理子交易,层级加1
            List<Trade> subTrades = trade.getSubTrades();
            if (subTrades != null && !subTrades.isEmpty()) {
                deepSplitRecursiveWithLevel(subTrades, currentLevel + 1, result);
            }
        }
    }
}

测试验证

构建嵌套的Trade数据测试拆分效果:

import java.util.Arrays;
import java.util.List;

public class TradeTest {
    public static void main(String[] args) {
        // 构建三层嵌套的Trade数据
        Trade subSubTrade1 = new Trade("sub_sub_1", 100.0, null);
        Trade subSubTrade2 = new Trade("sub_sub_2", 200.0, null);
        Trade subTrade1 = new Trade("sub_1", 300.0, Arrays.asList(subSubTrade1, subSubTrade2));
        Trade subTrade2 = new Trade("sub_2", 400.0, null);
        Trade rootTrade = new Trade("root_1", 500.0, Arrays.asList(subTrade1, subTrade2));

        // 测试基础拆分
        List<Trade> splitResult = TradeSplitUtil.deepSplitTradeList(Arrays.asList(rootTrade));
        System.out.println("基础拆分结果数量:" + splitResult.size());
        for (Trade trade : splitResult) {
            System.out.println("交易ID:" + trade.getTradeId() + ",金额:" + trade.getAmount());
        }

        // 测试带层级的拆分
        List<TradeVO> splitWithLevelResult = TradeSplitWithLevelUtil.deepSplitWithLevel(Arrays.asList(rootTrade));
        System.out.println("n带层级拆分结果:");
        for (TradeVO tradeVO : splitWithLevelResult) {
            System.out.println("交易ID:" + tradeVO.getTradeId() + ",金额:" + tradeVO.getAmount() + ",层级:" + tradeVO.getLevel());
        }
    }
}

注意事项

  • 递归处理前必须做空值校验,避免传入空列表或者Trade的子交易列表为空时抛出空指针异常。
  • 如果Trade嵌套层级过深,可能会出现栈溢出问题,这种情况下可以考虑把递归改为栈或队列的迭代实现。
  • 如果拆分后需要对不同层级的Trade做不同业务处理,可以在递归时根据层级参数添加对应的处理逻辑,不需要拆分完成后再做二次遍历。
  • 如果原始Trade列表数据量较大,拆分结果列表可以考虑使用初始容量设置,减少扩容带来的性能损耗。

JavaTrade列表深度拆分递归处理集合操作修改时间:2026-06-11 20:33:34

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。