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 
  • RxJava Observable a Completable, cómo evitar toBlocking ()
  • RX java / Android cómo lograr este brindis en cada clic usando el operador de rebote
  • Cómo get el valor del ObservableField en android
  • RxJava cómo crear Observable a partir de una Suscripción
  • Convierte el código de RxJava a Kotlin correctamente
  • RXJava Ignorar error y continuar en cadena
  • Uso del map RXJava en Kotlin?
  • Kolin - Lista de artículos para el artículo de lists
  • ¿Alguna diferencia entre "Subject.asObservable ()" y el tema en sí "Subject"?
  • Función rxjava :: zip devuelve un resultado vacío
  • Reaccionar a la llamada de actualización