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

如何在Kotlin中通过迭代原地修改数据类的Double类型属性值

不依赖额外库遍历Kotlin Data Class并修改Double类型属性值

需求说明

给定一个包含String类型和数百个Double类型属性的Data Class,需在不安装第三方库的前提下,遍历实例的所有属性,将所有Double类型属性的值乘以指定标量。

实现方案

利用JDK自带的Java反射机制完成需求,无需额外引入任何库(包括Kotlin反射库)。通过反射获取Data Class的所有字段,判断字段类型后修改对应值。

完整代码示例

data class Thing(
    var name: String,
    var a: Double,
    var b: Double,
    var c: Double,
    var d: Double
    // 扩展其他Double类型属性
)

fun main() {
    val something = Thing("stuff", 0.96, 0.72, 0.55, 81.4)
    val scalar = 3.75

    // 遍历并修改所有Double类型字段
    something.javaClass.declaredFields.forEach { field ->
        // 判断是否为基本类型double(Data Class的var Double属性对应基本类型字段)
        if (field.type == Double::class.javaPrimitiveType) {
            field.isAccessible = true // 允许访问私有字段
            val currentValue = field.getDouble(something)
            field.setDouble(something, currentValue * scalar)
        }
    }

    println(something)
    // 输出结果:Thing(name=stuff, a=3.6, b=2.7, c=2.0625, d=305.25)
}

代码说明

  1. 获取字段:通过javaClass.declaredFields获取当前类所有声明的字段,包括私有字段
  2. 类型判断:使用Double::class.javaPrimitiveType匹配基本类型double,对应Data Class中var xxx: Double定义的属性
  3. 权限设置:调用field.isAccessible = true突破私有字段的访问限制
  4. 值修改:通过getDouble和setDouble直接操作基本类型值,避免装箱拆箱开销

选择Data Class的原因

  • 自动生成getter、setter及toString()、equals()等核心方法,无需手动编写
  • 支持多类型属性,相比Map<String, Any>具备更强的类型安全性
  • 结构化的属性定义便于后续映射为CSV行记录,降低数据处理复杂度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 08:42:10