我可以通过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
}))
请原谅这样命名。这只是一个例子。