Kotlin class 对其 KProperties 的操作
Kotlin class operation on its KProperties
我有一个很大的 Kotlin 对象,需要对特定属性进行一些操作。
这是一个演示的小例子:
class ObjectForAnalysis {
var id: Int = 0
lateinit var successful: SUCCESSFUL
var job1: Job? = null
var job2: Job? = null
var job3: Job? = null
}
假设我有上述对象的多个实例,我需要对Job类型的属性进行如下操作。
job !=null && job.computeSquare() < 1000
我怎样才能做到这一点?
import kotlin.reflect.full.memberProperties
class Job(private var i: Int) {
fun getI(): Int = i
}
class ObjectForAnalysis {
var id: Int = 0
var job1: Job? = null
var job2: Job? = null
var job3: Job? = null
}
val list = listOf(
ObjectForAnalysis().also { it.id = 1; it.job1 = Job(2) },
ObjectForAnalysis().also { it.id = 2; it.job1 = Job(4); it.job2 = Job(3); it.job3 = Job(9) },
ObjectForAnalysis().also { it.id = 3; it.job1 = Job(12); it.job2 = Job(15) },
ObjectForAnalysis().also { it.id = 4 },
)
val properties = ObjectForAnalysis::class.memberProperties.filter { it.name.startsWith("job") }
val result = list
.filter { ofa ->
properties
.map { kProperty1 ->
(kProperty1.get(ofa) as Job?)?.let { job: Job -> job.getI() < 10 }
}
.all { it != null && it == true } // all i need to be < 10
// .any { it != null && it == true } // at least one i needs to be < 10
}
println("result:")
result.forEach {
println("id: ${it.id}, ints: ${it.job1?.getI()}, ${it.job2?.getI()}, ${it.job3?.getI()}")
}
println("excluded:")
list.minus(result).forEach {
println("id: ${it.id}, ints: ${it.job1?.getI()}, ${it.job2?.getI()}, ${it.job3?.getI()}")
}
.all { it != null && it == true }:
的输出
result:
id: 2, ints: 4, 3, 9
excluded:
id: 1, ints: 2, null, null
id: 3, ints: 12, 15, null
id: 4, ints: null, null, null
.any { it != null && it == true }:
的输出
result:
id: 1, ints: 2, null, null
id: 2, ints: 4, 3, 9
excluded:
id: 3, ints: 12, 15, null
id: 4, ints: null, null, null
我有一个很大的 Kotlin 对象,需要对特定属性进行一些操作。 这是一个演示的小例子:
class ObjectForAnalysis {
var id: Int = 0
lateinit var successful: SUCCESSFUL
var job1: Job? = null
var job2: Job? = null
var job3: Job? = null
}
假设我有上述对象的多个实例,我需要对Job类型的属性进行如下操作。
job !=null && job.computeSquare() < 1000
我怎样才能做到这一点?
import kotlin.reflect.full.memberProperties
class Job(private var i: Int) {
fun getI(): Int = i
}
class ObjectForAnalysis {
var id: Int = 0
var job1: Job? = null
var job2: Job? = null
var job3: Job? = null
}
val list = listOf(
ObjectForAnalysis().also { it.id = 1; it.job1 = Job(2) },
ObjectForAnalysis().also { it.id = 2; it.job1 = Job(4); it.job2 = Job(3); it.job3 = Job(9) },
ObjectForAnalysis().also { it.id = 3; it.job1 = Job(12); it.job2 = Job(15) },
ObjectForAnalysis().also { it.id = 4 },
)
val properties = ObjectForAnalysis::class.memberProperties.filter { it.name.startsWith("job") }
val result = list
.filter { ofa ->
properties
.map { kProperty1 ->
(kProperty1.get(ofa) as Job?)?.let { job: Job -> job.getI() < 10 }
}
.all { it != null && it == true } // all i need to be < 10
// .any { it != null && it == true } // at least one i needs to be < 10
}
println("result:")
result.forEach {
println("id: ${it.id}, ints: ${it.job1?.getI()}, ${it.job2?.getI()}, ${it.job3?.getI()}")
}
println("excluded:")
list.minus(result).forEach {
println("id: ${it.id}, ints: ${it.job1?.getI()}, ${it.job2?.getI()}, ${it.job3?.getI()}")
}
.all { it != null && it == true }:
的输出result:
id: 2, ints: 4, 3, 9
excluded:
id: 1, ints: 2, null, null
id: 3, ints: 12, 15, null
id: 4, ints: null, null, null
.any { it != null && it == true }:
的输出result:
id: 1, ints: 2, null, null
id: 2, ints: 4, 3, 9
excluded:
id: 3, ints: 12, 15, null
id: 4, ints: null, null, null