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

Kotlin嵌套对象列表过滤:按movieId筛选Theater层级嵌套数据

Kotlin嵌套对象列表按movieId过滤实现

需求说明

我们现有一组嵌套结构的Kotlin data class对象列表,涉及Theater、Screen、Show、Movie四个数据类,需要实现按指定movieId过滤场次的逻辑。

原始数据结构示例

Theater(
    theaterId = 1, name = "Inox", screen = listOf(
        Screen(id = 1, showList = listOf(
            Show(1, "9 AM", movieId = 1,160) ,
            Show(2, "12 PM", movieId = 2,200),
            Show(3, "3 PM", movieId = 3,240)
        )) ,
        Screen(id = 2, showList = listOf(
            Show(1, "10 AM", movieId = 4,160),
            Show(2, "1 PM", movieId = 5,200),
            Show(3, "4 PM", movieId = 1,240)
        )))) , Theater(
    theaterId = 2, name = "PVR", screen = listOf(
        Screen(id = 1, showList = listOf(
            Show(1, "9 AM", movieId = 2,160),
            Show(2, "12 PM", movieId = 3,200),
            Show(3, "3 PM", movieId = 4,240)
        )),
        Screen(id = 2, showList = listOf(
            Show(1, "10 AM", movieId = 5,160),
            Show(2, "1 PM", movieId = 1,200),
            Show(3, "4 PM", movieId = 2,240)
        ))))

过滤规则

  • 保留所有Theater和Screen节点
  • 仅过滤每个Screen下的showList,只保留movieId匹配的场次
  • 无匹配场次的Screen,showList保留为空列表

预期输出示例(传入movieId=1)

Theater(
    theaterId = 1, name = "Inox", screen = listOf(
        Screen(id = 1, showList = listOf(
            Show(1, "9 AM", movieId = 1,160) ,
        )) ,
        Screen(id = 2, showList = listOf(
            Show(3, "4 PM", movieId = 1,240)
        )))) , Theater(
    theaterId = 2, name = "PVR", screen = listOf(
        Screen(id = 1, showList = listOf(
        )),
        Screen(id = 2, showList = listOf(
            Show(2, "1 PM", movieId = 1,200),
        ))))

实现代码

借助Kotlin data class自带的copy方法实现嵌套结构的不可变修改,逻辑清晰且不会改动原对象:

// 基础数据类定义
data class Show(
    val id: Int,
    val time: String,
    val movieId: Int,
    val price: Int
)
data class Screen(
    val id: Int,
    val showList: List<Show>
)
data class Theater(
    val theaterId: Int,
    val name: String,
    val screen: List<Screen>
)

// 过滤扩展函数
fun List<Theater>.filterByMovieId(targetMovieId: Int): List<Theater> {
    return this.map { theater ->
        theater.copy(
            screen = theater.screen.map { screen ->
                screen.copy(
                    showList = screen.showList.filter { it.movieId == targetMovieId }
                )
            }
        )
    }
}

调用方式

// 原始影院列表
val originalTheaterList: List<Theater> = // 你的原始数据
// 过滤得到movieId=1的结果
val filteredList = originalTheaterList.filterByMovieId(1)

内容的提问来源于stack exchange,提问作者theLost Ip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 23:12:03