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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:57:00