对其 KProperties 进行 Kotlin 类操作

发布于 2025-01-13 03:39:13 字数 373 浏览 1 评论 0原文

我有一个很大的 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

我怎样才能做到这一点?

I have a big Kotlin object and need to do some operations on specific properties.
Here is a small example for demo:

class ObjectForAnalysis {
  var id: Int = 0
  lateinit var successful: SUCCESSFUL
  var job1: Job? = null
  var job2: Job? = null
  var job3: Job? = null
}

Imagine that I have multiple instances of the object above and that I need to do the following operation on the properties of type Job.

job !=null && job.computeSquare() < 1000

How could I achieve that ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

游魂 2025-01-20 03:39:13
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 && 的输出它 == 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
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()}")
}

Output for .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

Output for .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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文