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
相关产品推荐
相关产品推荐

