Kotlin cuádruple, quíntuple, etc. para desestructurar

Estoy buscando una forma limpia de crear objects desestructurables en línea. kotlin.Pair y kotlin.Triple cubren muchos casos de uso, pero a veces hay más objects que se necesitan pasar.

Un caso de uso de muestra es la function zip de RX, donde los resultados de varias llamadas de E / S deben asignarse a otro object:

 Single .zip(repositoryA.loadData(someId), repositoryB.loadData(someId), repositoryC.loadAll(), repositoryD.loadAll()), { objectA, objectB, objectsC, objectsD -> /*some Kotlin magic*/ } ) .map { (objectA, objectB, objectsC, objectsD) -> /*do the mapping*/ } 

Estoy tratando de descubrir qué pasaría en la parte "algo de la magia de Kotlin". Si hubiera solo 3 repositorys, sería

 Triple(objectA, objectB, objectsC) 

¿Necesito crear una nueva class de datos para esto, y para cualquier caso n-tuple, o hay otra manera?

Lo esencial

Veamos cómo funciona la desestructuración :

Kotlin define una convención para esto, es decir, las funciones del operator componentX() son un ejemplo del principio de las convenciones utilizadas en Kotlin en muchos lugares. Estas funciones componentX() son utilizadas por el comstackdor para la initialization de variables en declaraciones de desestructuración.

Por ejemplo, en Pair<A,B> estas funciones se ven de la siguiente manera:

 operator fun component1(): A = first operator fun component2(): B = second 

Como puede ver, estos son operators , funciones manejadas especialmente. El desarrollador puede proporcionar estas funciones componentX() y el comstackdor las generará automáticamente para data classs de data . Pair también es una class de data cierto.

Responder

Por lo tanto, solo siga adelante y use data classs de data cada vez que necesite más de una Triple .

Por ejemplo, una class MultiComponent definida como esta:

 data class MultiComponent(val x: Int, val y: Int, val z: Int, val a: Int, val b: Int, val c: Int) 

se comstackrá en una class con funciones component1() , component2() , …, component6() y se puede usar en declaraciones de desestructuración:

 val (q, w, e, r, t, z) = MultiComponent(1, 2, 3, 4, 5, 6) 

Vea esta publicación en el blog (la mía) para más detalles sobre las convenciones y desestructuración de Kotlin.

A diferencia de Scala, Kotlin no tiene n-tuplas para valores superiores a 3 definidos. Has identificado correctamente Pair y Triple .

Kotlin favorece el uso de classs de datos para estos casos de uso, de acuerdo con esta publicación del blog . Entonces sí, tendrás que definir una class de datos para hacer lo que quieras, no hay Quadruple . Yo personalmente argumentaría que definir tu propia class de datos es más claro, y terminará siendo comstackdo y utilizado de la misma manera que un Quadruple hipotético de todos modos, bajo las sábanas.

En cuanto a las classs de datos de desestructuración, Kotlin también lo admite:

 data class Thingy(val a: String, val b: String, val c: String, val d: String) val t = Thingy("A", "B", "C", "D") val (aa, bb, cc, dd) = t 
  • Reemplazar callbacks llamados externamente con RxJava
  • ¿Cómo get respuesta en la retroadaptación al usar rxAndroid?
  • ¿Expresar "súper" generics en los types funcionales de Kotlin?
  • Comportamiento de RxJava Schedulers.immediate () mientras testings unitarias
  • RxJava BehaviorSubject no emite el último elemento?
  • Usando RxJava con Handler, restablece Message.what value
  • ¿Cómo crear un intervalo infinito observable que emitirá un nuevo object cada intervalo de time?
  • RxJava: onBackpressureBlock () comportamiento extraño
  • Cómo get un tipo correcto al devolver Template <T?> Desde una function estática con null
  • RxJava cómo agrupar elementos de una list en Map <Key, List <Value >>
  • ¿Cómo puedo agregar de manera condicional una operación asincrónica en medio de una transmisión de RxJava?