Kotlin四倍,五倍等解构

我正在寻找一种干净的方式来创建内联可破坏的对象。 kotlin.Pairkotlin.Triple覆盖了很多用例,但是有时需要传递更多的对象。

一个示例用例是RX的zip函数,其中几个I / O调用的结果需要映射到另一个对象:

 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*/ } 

我想弄清楚“Kotlin的一些魔力”部分会发生什么。 如果只有三个版本库,那将是

 Triple(objectA, objectB, objectsC) 

我是否需要为此创建一个新的数据类,对于任何n元组情况,还是有另一种方法?

基本

让我们看看解构如何工作:

Kotlin为此定义了一个约定,即componentX() operator函数是许多地方在Kotlin中使用约定原则的一个例子。 编译器使用这些componentX()函数来初始化解构声明中的变量。

例如在Pair<A,B>这些函数如下所示:

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

正如你可以看到这些是operators特别处理的功能。 这些componentX()函数可以由开发人员提供,并由编译器自动生成data类。 Pair也是这样一个data类btw。

回答

因此,只要您需要的不只是一个Triple ,就继续使用data类。

例如,一个MultiComponent类定义为:

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

将被编译为一个具有函数component1()component2() ,…, component6()并且可以用于解构声明:

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

看到这个博客文章 (我的)Kotlin公约和解构的更多细节。

与Scala相比,Kotlin对于高于3的值没有n元组。 您已经正确识别了PairTriple

根据这篇博客文章 ,Kotlin倾向于使用这些用例的数据类。 所以是的,你必须定义一个数据类来做你想做的,没有Quadruple 。 我个人认为,定义自己的数据类更加清晰,并且最终将被编译和使用,就像一个假设的Quadruple将会在封面下一样。

至于解构数据类,Kotlin也支持:

 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