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

Kotlin中如何访问存储在列表中的数据类变量

问题:查找可变列表中符合条件的数据类对象并返回指定属性值

我定义了一个包含大量属性的数据类Example,其对象被存储在可变列表exampleList中。请问如何查找列表中符合用户输入特定条件的对象,并返回该对象的关联属性?例如,用户需要查看属性a等于"test"的对象的属性d的值,该如何实现?

你的代码示例(已修正编译问题)

// 修正列表类型为MutableList<Example>,避免不必要的类型转换
var exampleList = mutableListOf<Example>()

data class Example(val a: String, val b: String, val c: String, val d: String, val e: String,
                   val f: String,val g: String, val h: String, val i: String, val j: String, val k: String,
                   val l:String, val m: String, val n:String, val q: String, val r: String,
                   val s: String, val t: String, val u: String, val v: String, val w: String,
                   val x: String, val y: String, val z: String, val aa: String, val bb: String,
                   val cc: String, val dd: String, val ee: String, val ff: String,
                   val ruptureDisc: String, val ruptureDiscNotes: String, val remote: String, val gg: String,
                   val hh: String, val ii: String, val jj: String, val kk: String, val ll: String,
                   val mm: String, val nn: String, val oo: String, val pp: String, val qq:String,
                   val rr: String)

fun addToList() {
    exampleList.add(
        // 原代码传入数字会编译错误,改为字符串匹配属性类型
        Example("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11",
            "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22",
            "23", "24", "25", "26", "27", "28", "29", "30",
            "31", "32", "33", "34", "35", "36", "37", "38", "39", "40",
            "41", "42", "43", "44", "45")
    )
}

解决方案

1. 基础实现(针对特定条件+属性)

如果只需要处理a == "test"并返回d属性的场景,直接用Kotlin集合的find函数即可:

// 根据属性a的值查找对应的属性d
fun getDByA(targetA: String): String? {
    // 找到第一个符合条件的Example对象
    val matchedExample = exampleList.find { it.a == targetA }
    // 存在则返回d属性,否则返回null
    return matchedExample?.d
}

// 使用示例
val targetD = getDByA("test")
println(targetD) // 找到则输出对应d值,否则输出null

2. 通用实现(支持任意条件+属性)

如果需要适配用户输入的任意条件和任意属性提取需求,可以封装一个通用函数:

/**
 * 根据自定义条件查找对象,并提取指定属性
 * @param condition 判断对象是否符合要求的Lambda表达式
 * @param propertyExtractor 提取目标属性的Lambda表达式
 * @return 符合条件的对象的目标属性,找不到则返回null
 */
fun <T> getPropertyByCondition(
    condition: (Example) -> Boolean,
    propertyExtractor: (Example) -> T
): T? {
    return exampleList.find(condition)?.let(propertyExtractor)
}

// 使用示例1:查找a等于"test"的对象的d属性
val dValue = getPropertyByCondition({ it.a == "test" }, { it.d })
// 使用示例2:查找remote等于"enabled"的对象的ruptureDisc属性
val ruptureDiscValue = getPropertyByCondition({ it.remote == "enabled" }, { it.ruptureDisc })

3. 批量查找场景

如果需要返回所有符合条件的对象的目标属性,用filter+map组合:

// 获取所有a等于"test"的对象的d属性列表
fun getAllDByA(targetA: String): List<String> {
    return exampleList.filter { it.a == targetA }.map { it.d }
}

关键注意点

  • 必须将exampleList的类型从MutableList<Any>改为MutableList<Example>,避免强制类型转换的安全风险,同时简化代码。
  • 原代码中addToList传入的数字与Example的字符串属性不匹配,已修正为字符串形式,否则会编译失败。

内容的提问来源于stack exchange,提问作者Whitt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 00:47:50