我正在寻找一种干净的方式来在线创建可破坏的对象. 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,objectsD) -> /*do the mapping*/ }
我想弄清楚“一些Kotlin魔法”部分会发生什么.如果只有3个存储库,那就是
Triple(objectA,objectsC)
我是否需要为此创建一个新的数据类,以及任何n元组的情况,还是有另一种方法?
解决方法
基本
让我们看看解构是如何工作的:
Kotlin为此定义了一个约定,即componentX()运算符函数是许多地方在Kotlin中使用的约定原则的一个例子.编译器使用这些componentX()函数来初始化解构声明中的变量.
例如,在Pair< A,B>中.这些功能如下:
operator fun component1(): A = first operator fun component2(): B = second
正如您所看到的,这些是operators
,特别处理的功能.
这些componentX()函数可以由开发人员提供,并由编译器自动生成数据类.对也是这样的数据类btw.
回答
因此,只要您需要三个以上的数据,就可以继续使用数据类.
例如,一个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约定和解构的更多详细信息,请参见this blog post(我的).