如何在Kotlin中聚合Order及子订单列表为单一Order列表?
解决方案
要实现把每个主订单及其子订单合并为一个列表,再将所有这些列表扁平为单一的Order列表,你可以用Kotlin的flatMap函数替代map——它会自动将每个元素转换后的列表展开并合并成一个最终列表,完美适配你的需求。
核心思路
- 针对每个订单ID,先获取对应的主订单和子订单列表
- 把主订单和子订单列表合并成一个临时列表(顺序可根据业务需求调整)
- 用
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
相关产品推荐
相关产品推荐

