Kotlin嵌套属性引用

时间:2017-06-25 21:39:34

标签: kotlin

data class House(var name: String = "House", var door: Door = Door())
data class Door(var name: String = "Door")

fun test() {
   val testHouse = House("My house", Door(name = "My door"))
}

我怎样才能使嵌套属性引用变得更好和安全,理想情况下这样(虽然这不起作用):

   val houseDoorName = House::door::name
   println(houseDoorName.get(testHouse)) //My door

我认为我可以做扩展功能,例如:House::door.nested(Door::name),但我坚持执行。

1 个答案:

答案 0 :(得分:5)

对于您假设的nested函数,请尝试以下操作:

fun <A, B, C> ((A) -> B).nested(getter : (B) -> C) : (A) -> C = { getter(this(it)) }

现在你可以完全按照你的要求做到:

val houseDoorName = House::door.nested(Door::name)
val house = House(door = Door(name = "My door"))
println(houseDoorName(house)) // prints "My door"

您也可以链接它:

val doorNameLength = House::door.nested(Door::name).nested(String::length)

这里的巧妙技巧是Kotlin允许将属性引用视为函数的方式。

nested函数本质上是一个功能组合。它需要一个函数a -> b和一个函数b -> c,并将它们组合成一个新函数a -> c。您经常会在标准库中找到它compose

Kotlin没有标准的功能组成,但是如果你需要比这更复杂的东西,那里就有库。

相关问题