Kotlin中如何借助外部布尔变量从ArrayList获取对应值?
优雅实现根据布尔值从ArrayList的Color数据类中获取对应颜色值
针对你的需求,完全可以通过Kotlin扩展函数实现,而且不需要使用forEach循环,下面提供两种更优雅的方案:
方案一:给可空Color类型写扩展函数(推荐)
这种方式最灵活,既能处理find可能返回null的情况,又能让链式调用更简洁:
// 扩展可空Color类型,根据布尔值返回对应颜色,同时处理null场景 fun Color?.getTargetColor(isDone: Boolean, defaultColor: Int = 0): Int { return this?.let { if (isDone) it.colorA else it.colorB } ?: defaultColor }
在你的函数中使用:
private val isDone = true // 或false private const val TEXT = "text" private const val BACK = "back" private fun color(key: String): Int { val colors = arrayListOf( Color(TEXT, R.color.text_light, R.color.text_night), Color(BACK, R.color.background_light, R.color.background_night), // 其他Color实例 ) // 链式调用,完全符合你期望的简洁逻辑 return colors.find { it.key == key }.getTargetColor(isDone, R.color.default_color) }
方案二:给ArrayList写扩展函数
如果想直接在ArrayList上完成查找+取值的逻辑,也可以给ArrayList写专属扩展:
// 直接在ArrayList上根据key和布尔值获取目标颜色 fun ArrayList<Color>.getColorByKey(key: String, isDone: Boolean, defaultColor: Int = 0): Int { return this.find { it.key == key }?.let { if (isDone) it.colorA else it.colorB } ?: defaultColor }
在你的函数中使用:
private fun color(key: String): Int { val colors = arrayListOf( Color(TEXT, R.color.text_light, R.color.text_night), Color(BACK, R.color.background_light, R.color.background_night), // 其他Color实例 ) return colors.getColorByKey(key, isDone, R.color.default_color) }
说明
- 两种方案都避免了forEach循环,利用Kotlin的扩展函数特性实现了优雅的调用
- 方案一的扩展性更强,任何地方的Color(或Color?)实例都能复用这个颜色选择逻辑
- 代码中加入了默认颜色参数,避免
find找不到对应key时出现空指针异常
内容的提问来源于stack exchange,提问作者Mark Delphi
相关产品推荐
相关产品推荐

