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.

  • Kotlin y Upper Type Bounds con covarianza
  • Completion Handler Android Kotlin
  • La expresión lambda no se usa
  • ¿Por qué los texts no cambian en actividad?
  • ¿Cómo puedo get el time que lleva una function probar el performance de las funciones en Kotlin?
  • No se puede burlar de la class final de Kotlin usando Mockito 2
  • ¿Es seguro llamar a kclass.memberProperties en un object desconocido (Cualquiera)?
  • ¿Puedo extender, en Java, una class de delegación de Kotlin?
  • kotlin, ¿cómo simplificar pasar los parameters al constructor de la class base?
  • isInitialized - El campo de respaldo de var tardinit no está accesible en este punto
  • Jna, Pointer ya asignado a la interfaz Proxy