如何在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) }
代码说明
- 获取字段:通过
javaClass.declaredFields获取当前类所有声明的字段,包括私有字段 - 类型判断:使用
Double::class.javaPrimitiveType匹配基本类型double,对应Data Class中var xxx: Double定义的属性 - 权限设置:调用
field.isAccessible = true突破私有字段的访问限制 - 值修改:通过
getDouble和setDouble直接操作基本类型值,避免装箱拆箱开销
选择Data Class的原因
- 自动生成getter、setter及
toString()、equals()等核心方法,无需手动编写 - 支持多类型属性,相比
Map<String, Any>具备更强的类型安全性 - 结构化的属性定义便于后续映射为CSV行记录,降低数据处理复杂度
内容的提问来源于stack exchange,提问作者AvyWam
相关产品推荐
相关产品推荐

