Kotlin四倍,五倍等解构
我正在寻找一种干净的方式来创建内联可破坏的对象。 kotlin.Pair
和kotlin.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元组。 您已经正确识别了Pair
和Triple
。
根据这篇博客文章 ,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