如何将对象嵌套列表中的指定元素置空?移除数组中所有"jim"实例
移除嵌套对象列表中的指定元素("jim")
背景说明
你的现有代码中,Vehicle和Load都是不可变数据类(属性为val),且people是不可变List。针对需求,提供两种符合Kotlin风格的解决方案:
方案一:保持不可变性,生成新集合
利用数据类自带的copy方法,创建过滤后的新对象集合,完全避免修改原数据:
fun main(args: Array<String>) { val listOfObjects = arrayOf( Vehicle("blue", 2, Load(listOf("jim","jack"))), Vehicle("black",3, Load(listOf("jim","jack", "johnny"))) ) // 过滤所有"jim"实例,生成新数组 val filteredVehicles = listOfObjects.map { vehicle -> // 过滤当前Vehicle的Load中的people val filteredPeople = vehicle.load.people.filter { it != "jim" } // 复制Vehicle对象,替换为过滤后的Load vehicle.copy(load = vehicle.load.copy(people = filteredPeople)) }.toTypedArray() // 验证结果 filteredVehicles.forEach { println(it) } } data class Vehicle(val color: String, val seats: Int, val load: Load) data class Load(val people: List<String>)
运行输出:
Vehicle(color=blue, seats=2, load=Load(people=[jack])) Vehicle(color=black, seats=3, load=Load(people=[jack, johnny]))
方案二:修改为可变属性,直接修改原对象
如果业务允许修改原数据,可以将Load的people改为可变列表MutableList,并修改属性为var,直接在原集合上操作:
fun main(args: Array<String>) { val listOfObjects = arrayOf( Vehicle("blue", 2, Load(mutableListOf("jim","jack"))), Vehicle("black",3, Load(mutableListOf("jim","jack", "johnny"))) ) // 直接移除所有"jim"实例 listOfObjects.forEach { vehicle -> vehicle.load.people.removeAll { it == "jim" } } // 验证结果 listOfObjects.forEach { println(it) } } data class Vehicle(val color: String, val seats: Int, val load: Load) data class Load(var people: MutableList<String>)
方案选择建议
- 优先选方案一:符合Kotlin不可变编程的设计理念,无副作用,更安全,尤其适合多线程或函数式编程场景。
- 方案二仅适合:必须修改原对象的特殊业务场景,注意可变状态可能带来的维护风险。
内容的提问来源于stack exchange,提问作者SlowLearnah
相关产品推荐
相关产品推荐

