RxJava如何在一个函数的Observable中返回两个以上的数组列表



我可以通过observable传递两个列表,正如下面所提到的

fun loadAll(contact: String?): Single<Pair<ArrayList<Contact>, ArrayList<Contact>>> {
return packageDB.loadAll()
.map { table ->
val one = ArrayList< Contact >()
val two = ArrayList< Contact >()
val three = ArrayList< Contact >()

one to two
}
} 

在片段中,我试图返回为:

disposables.add(
viewModel.loadAll(contact)
.subscribe({
val firstList = it.first
val secondList = it.second
val third = ArrayList<Contact>()
}))

我是新的响应式编程,所以我无法理解我如何能够传递或返回两个以上的列表,因为Pair对象只能有两个子对象。如果您能告诉我解决办法,我将不胜感激。

有不止一种方法可以做到这一点,我可以列出一些。您只需要考虑返回对象。如果你只想返回3个东西,我甚至不会麻烦创建一个特定的类,如果它很清楚你在做什么。Kotlin已经为此开设了一个课程——Triple。它就像一对,但包含3个值:

fun loadAll(contact: String?): Single<Triple<ArrayList<Contact>, ArrayList<Contact>, ArrayList<Contact>>> {
return packageDB.loadAll()
.map { table ->
val one = ArrayList< Contact >()
val two = ArrayList< Contact >()
val three = ArrayList< Contact >()

Triple(one, two, three)
}
} 

然后访问它们:

disposables.add(
viewModel.loadAll(contact)
.subscribe({
val firstList = it.first
val secondList = it.second
val third = it.third
}))

如果你有超过3个值,我不确定是否已经有一个类,但总是有使用数组的数组的选项:

fun loadAll(contact: String?): Single<Array<ArrayList<Contact>> {
return packageDB.loadAll()
.map { table ->
val one = ArrayList< Contact >()
val two = ArrayList< Contact >()
val three = ArrayList< Contact >()

arrayListOf(one, two, three)
}
} 

disposables.add(
viewModel.loadAll(contact)
.subscribe({ (firList, secondList, thirdList) ->
// the above destructures the list into 3 variables
// if the list has less than 3 elements you'll get an index out of bounds exception
// otherwise you can just use the variables
}))

正如在评论中指出的那样,这可能会在理解每个值是什么时产生一些问题,所以有时最好创建自己的类:

data class Values(
val primaryContacts: ArrayList< Contact >(),
val secondaryContacts: ArrayList< Contact >(),
val emergencyContacts: ArrayList< Contact >(),
)
fun loadAll(contact: String?): Single<Values> {
return packageDB.loadAll()
.map { table ->
val one = ArrayList< Contact >()
val two = ArrayList< Contact >()
val three = ArrayList< Contact >()

Values(one, two, three)
}
} 
disposables.add(
viewModel.loadAll(contact)
.subscribe({
val firstList = it.primaryContacts
val secondList = it.secondaryContacts
val third = it.emergencyContacts
}))

请原谅这样命名。这只是一个例子。

相关内容

  • 没有找到相关文章

最新更新