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

如何在Kotlin中聚合Order及子订单列表为单一Order列表?

解决方案

要实现把每个主订单及其子订单合并为一个列表,再将所有这些列表扁平为单一的Order列表,你可以用Kotlin的flatMap函数替代map——它会自动将每个元素转换后的列表展开并合并成一个最终列表,完美适配你的需求。

核心思路

  1. 针对每个订单ID,先获取对应的主订单和子订单列表
  2. 把主订单和子订单列表合并成一个临时列表(顺序可根据业务需求调整)
  3. 用flatMap替代原代码中的map,让Kotlin自动将所有临时列表的元素合并为一个大列表

完整代码示例

// 示例预定义订单ID列表
val orderIds = listOf(1L, 2L, 3L, 4L, 5L)
val allOrders = orderIds.flatMap { orderId ->
    // 获取主订单
    val mainOrder = orderService.getOrderById(orderId)
    // 获取子订单列表
    val subOrders = suborderService.getSubordersByOrderId(orderId)
    
    // 合并主订单与子订单,同时处理主订单可能为null的情况
    if (mainOrder != null) {
        listOf(mainOrder) + subOrders
    } else {
        // 若主订单不存在,可选择只返回子订单或空列表,按需调整
        subOrders
    }
}

额外优化建议

  • 空值处理:如果getOrderById可能返回null,上面的代码已经做了基础判断,你可以根据业务需求选择丢弃空主订单、抛出异常或者做其他处理
  • 并行优化(可选):如果订单ID数量较多,且API调用支持并行,可借助协程提升效率:
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.runBlocking

val allOrders = runBlocking(Dispatchers.IO) {
    orderIds.map { orderId ->
        async {
            val mainOrder = orderService.getOrderById(orderId)
            val subOrders = suborderService.getSubordersByOrderId(orderId)
            mainOrder?.let { listOf(it) + subOrders } ?: subOrders
        }
    }.awaitAll().flatten()
}
  • DTO扩展(可选):如果后续需要频繁关联主订单与子订单,可以考虑给Order类新增subOrders字段,返回包含子订单的结构化主订单对象,而非扁平列表——这取决于你的业务场景需求。

内容的提问来源于stack exchange,提问作者darth jemico

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:47:37