Kotlin如何不使用循环修改列表符合条件的对象属性且不生成新列表
解决方案
基础用法(无需封装,单次使用)
Kotlin 标准库的forEach本身就完全符合你的要求:它是终端操作符,仅遍历集合执行指定逻辑,不会生成新列表,你修改的是集合内 Account 对象的属性,直接作用于原对象,和 filter 这类返回新集合的转换操作符有本质区别。
示例代码:
// 将 type 为 1 的账户 isVisible 设为 true accountList.forEach { account -> if (account.type == 1) account.isVisible = true } // 调整条件即可适配其他场景 accountList.forEach { account -> if (account.type == 2) account.isVisible = true }
封装扩展函数(适合大量重复场景)
如果你有大量类似的条件修改需求,可以给 Account 集合封装专属扩展函数,彻底解决代码冗余问题:
首先定义扩展函数:
/** * 对符合条件的 Account 设置 isVisible 属性,直接修改原对象,无新列表生成 * @param visible 要设置的 isVisible 值 * @param predicate 判断是否需要修改的条件 lambda */ fun Iterable<Account>.setVisibleIf(visible: Boolean, predicate: (Account) -> Boolean) { forEach { if (predicate(it)) it.isVisible = visible } }
使用示例:
// type 为 1 的设为可见 accountList.setVisibleIf(true) { it.type == 1 } // type 为 2 的设为可见 accountList.setVisibleIf(true) { it.type == 2 } // 支持任意复杂条件,比如 type 为 3 且 someId 大于 100 的设为不可见 accountList.setVisibleIf(false) { it.type == 3 && it.someId > 100 }
补充说明
如果你需要链式调用其他集合操作,可以用onEach代替forEach,它会返回原集合本身,同样不会生成新集合:
accountList.onEach { if (it.type == 1) it.isVisible = true } .filter { it.isVisible } // 后续可以直接链式操作原集合
注意:只有 filter、map 这类转换操作符才会生成新列表,forEach、onEach 仅执行遍历动作,完全不会额外生成列表,符合你的需求。
内容的提问来源于stack exchange,提问作者Cassius
相关产品推荐
相关产品推荐

