每个数据类对象都有一个组件,用于每个属性,如组件1、组件2等。我想知道在静态编程语言中是否有任何方法可以迭代类的每个组件。假设我有类:
data class User(age:Int, name:String)
我可以这样做吗:
for(component in aUserObject){
//do some stuff with age or name
}
?
首先,组件N
属性仅在数据类上可用,而不是在每个对象上。
没有专门用于迭代组件的API,但您可以使用静态编程语言反射来迭代任何类的属性:
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)}")
}
}
此外,您可以将属性委托与内置委托“by map”一起使用。它对于一些简单的stat类非常有用。
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")
对于任何寻找无反射解决方案的人来说,这里有一个。
重要提示:这要求您能够修改User
数据类。
您可以将自己的迭代器函数写入数据类,如下所示:
data class User(age: Int, name: String) {
operator fun iterator(): Iterator<Pair<String, Any>> {
return listOf("age" to age, "name" to name)
}
}
尽管一开始有点麻烦,但这允许您像这样使用for-each样式循环,因为静态编程语言在后台调用iterator()
函数来使for-each循环工作:
val aUserObject: User = User(36, "John Doe")
for ((key, value) in aUserObject) {
println("$key: $value") // age: 36
// name: John Doe
}
这使您的User
类保持为数据类,并且不需要使用反射。