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.

  • No se puede usar la biblioteca de kotlin
  • Kotlin invoke getter / setter reflexivamente
  • Crear classs de Kotlin en Android Studio usando acciones de intención
  • el modificador lateinit no está permitido en las properties de tipo primitivo en Kotlin
  • La mejor forma de manejar instancias de objects múltiples
  • Clase abstracta de Kotlin con param genérico y methods que usan param de tipo
  • Pasar parameters a un getter personalizado en kotlin
  • 'kapt.generateStubs' no es usado por el complemento 'kotlin-kapt'
  • ¿Cómo inyectar los resources de spring en las classs Apache Ignite?
  • Cómo especificar @Throws para una propiedad en la interfaz
  • La API de Autocompletar de Google Places da error API_NOT_CONECTADO en la configuration de Aplicaciones instantáneas