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)但Im坚持实施。

对于你的假设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没有标准的功能组合,但是如果你需要比这更复杂的东西,那么就有图书馆。