Kotlin:迭代对象的组件

Ser*_*ion 20 kotlin

每个数据类对象都有一个组件,用于每个属性,如component1,component2等.我想知道Kotlin中是否有任何方法可以迭代类的每个组件.说我上课了:

class User(age:Int, name:String)
Run Code Online (Sandbox Code Playgroud)

我可以这样做:

for(component in aUserObject){
    //do some stuff with age or name
}
Run Code Online (Sandbox Code Playgroud)

yol*_*ole 37

首先,这些componentN属性仅适用于数据类,而不适用于每个对象.

没有专门用于迭代组件的API,但您可以使用Kotlin反射来迭代任何类的属性:

class User(val age: Int, val name: String)

fun main(args: Array<String>) {
    val user = User(25, "Bob")
    for (prop in User::class.memberProperties) {
        println("${prop.name} = ${prop.get(user)}")
    }  
}
Run Code Online (Sandbox Code Playgroud)

  • 这仍然是最新的吗?获取没有属性memberProperties的错误 (4认同)
  • @AdamHughes:添加此导入行:`import kotlin.reflect.full.memberProperties` (3认同)
  • 更新了 API 链接。您需要将 kotlin-reflect 添加到依赖项中才能使用此方法。 (2认同)

Yev*_*hii 9

此外,您可以使用“按映射”内置委托的属性委托。它对于一些简单的统计类非常有用。

class DbUsingStat {
  private val map = mutableMapOf(
    "removed" to 0,
    "updated" to 0,
    "skipped" to 0
  )

  var removed by map
  var updated by map
  var skipped by map

  fun asMap() : Map<String, Int> = map.toMap()
}

...
...


val someStatistic = DbUsingStat().apply {
  skipped = 5
  removed = 10
  updated = 1505
}

for((k, v) in someStatistic.asMap())
  println("$k: $v")
Run Code Online (Sandbox Code Playgroud)