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

如何在Kotlin中通过变量动态更新Player类的属性

解决方案:动态更新Player类的指定属性

方案1:用when表达式直接判断(最直观)

先修正你代码里的小问题:Kotlin规范里类名首字母要大写(比如Player而非player),变量名首字母小写(team而非Team),还有=+是笔误,应该是+=。

直接通过when判断你传入的属性名称,对应更新就行:

data class Player(
    val name: String = "",
    var goals: Int = 0,
    var assists: Int = 0
)

val testPlayerName: String = "Bob"
val goalsOrAssists: String = "goals" // 这里替换成用户输入的字符串

fun main() {
    var team: List<Player> = listOf(
        Player(name="Dave", goals=0, assists=0),
        Player(name="Bob", goals=0, assists=0),
        Player(name="Barry", goals=0, assists=0),
        Player(name="Bill", goals=0, assists=0)
    )

    team.forEach { player ->
        if (player.name == testPlayerName) {
            // 用lowercase避免大小写问题
            when (goalsOrAssists.lowercase()) {
                "goals" -> player.goals += 1
                "assists" -> player.assists += 1
                // 以后要加「踢围栏次数」,直接在这里加分支就行
                else -> println("不认识的统计项:$goalsOrAssists")
            }
        }
    }
    println(team)
}

方案2:把更新逻辑封装到Player类(推荐,易扩展)

如果以后要加更多统计项(比如你说的踢围栏次数),把更新逻辑放到Player类里会更清晰,也方便维护:

data class Player(
    val name: String = "",
    var goals: Int = 0,
    var assists: Int = 0,
    var fencesKicked: Int = 0 // 提前加上踢围栏次数
) {
    // 专门写个方法处理统计项递增
    fun incrementStat(statType: String) {
        when (statType.lowercase()) {
            "goals" -> goals += 1
            "assists" -> assists += 1
            "fences_kicked" -> fencesKicked += 1
            else -> println("无效的统计项:$statType")
        }
    }
}

fun main() {
    val testPlayerName = "Bob"
    val statToUpdate = "assists" // 用户输入的目标统计项

    val team = listOf(
        Player("Dave"),
        Player("Bob"),
        Player("Barry"),
        Player("Bill")
    )

    team.forEach { player ->
        if (player.name == testPlayerName) {
            player.incrementStat(statToUpdate)
        }
    }
    println(team)
}

方案3:反射方式(不推荐简单场景使用)

如果你的统计项特别多,不想写一堆when分支,可以用反射,但反射性能差,而且容易出错,只适合复杂场景:

import kotlin.reflect.full.memberProperties

data class Player(
    val name: String = "",
    var goals: Int = 0,
    var assists: Int = 0
)

fun main() {
    val testPlayerName = "Bob"
    val statToUpdate = "goals"

    val team = listOf(
        Player("Dave"),
        Player("Bob"),
        Player("Barry"),
        Player("Bill")
    )

    team.forEach { player ->
        if (player.name == testPlayerName) {
            // 通过反射找到对应的属性
            val property = Player::class.memberProperties.find { it.name == statToUpdate }
            if (property is kotlin.reflect.KMutableProperty<*>) {
                val currentValue = property.get(player) as Int
                property.set(player, currentValue + 1)
            } else {
                println("统计项$statToUpdate不存在或者是只读的")
            }
        }
    }
    println(team)
}

额外提示

  • Kotlin里List是不可变集合,但修改集合中对象的属性是允许的(因为存的是对象引用);如果以后要添加/删除球员,建议用MutableList。
  • 用lowercase()处理用户输入可以避免大小写不一致的问题(比如用户输入"Goals"也能识别)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 07:17:20