Referencia de propiedad anidada 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")) } 

¿Cómo puedo hacer que la reference de propiedad anidada sea agradable y segura, idealmente así (aunque esto no funciona):

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

Pensé que podría hacer la function de extensión, algo así como: House::door.nested(Door::name) pero estoy atascado con la implementación.

Para su function nested hipotética, intente esto:

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

Ahora puedes hacer exactamente lo que pediste:

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

Puedes encadenarlo también:

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

El truco perfecto aquí es la forma en que Kotlin permite que una reference de propiedad sea tratada como una function.

La function nested es esencialmente una composition funcional. Toma una function a -> b y una function b -> c , y las compone en una nueva function a -> c . A menudo lo encontrará llamado compose en bibliotecas estándar.

Kotlin no tiene la composition de funciones como estándar, pero hay bibliotecas por ahí si necesita algo más complejo que esto.

  • ¿Puedo usar @autowire (spring-context) para una aplicación de escritorio kotlin?
  • ¿Por qué todavía es necesario lanzar el tipo aunque ya se haya asegurado en este ejemplo?
  • La aplicación se bloquea al intentar save el file con ObjectOutputStream
  • Uso en generics en Multibinder
  • Daga con Mvp en Kotlin - Android
  • Cómo convertir Long to Int en Kotlin?
  • Propiedad diferida de Kotlin dependiendo de otra propiedad inicializada en init
  • Dagger2 @Nullable anotación con Kotlin
  • Kotlin generic super / child classes
  • Enlazando una vista a una propiedad de controller cambiante
  • Kotlin flatMap - map