RxJava 如何在函数中的 Observable 中 return 超过 2 个 ArrayList
RxJava How to return more than 2 ArrayLists within Observable in a function
我可以通过 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
}
}
在 Fragment 中,我试图 return 作为:
disposables.add(
viewModel.loadAll(contact)
.subscribe({
val firstList = it.first
val secondList = it.second
val third = ArrayList<Contact>()
}))
我是响应式编程的新手,所以我无法理解如何传递或 return 两个以上的列表,因为 Pair 对象只能有两个子对象。如果您能告诉我解决方案,我将不胜感激。
这样做的方法不止一种,我可以列出一些。您只需要考虑 return 对象。如果你只想 return 3 件事,如果你清楚你在做什么,我什至不会费心去创建一个特定的 class。 Kotlin 已经为此设置了 class - 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 个值,我不确定是否已经有一个 class,但总是可以选择使用数组的数组:
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
}))
正如评论中所指出的,这可能会在理解每个值是什么时产生一些问题,因此有时最好创建自己的 class:
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
}))
命名请见谅。这只是一个例子。
我可以通过 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
}
}
在 Fragment 中,我试图 return 作为:
disposables.add(
viewModel.loadAll(contact)
.subscribe({
val firstList = it.first
val secondList = it.second
val third = ArrayList<Contact>()
}))
我是响应式编程的新手,所以我无法理解如何传递或 return 两个以上的列表,因为 Pair 对象只能有两个子对象。如果您能告诉我解决方案,我将不胜感激。
这样做的方法不止一种,我可以列出一些。您只需要考虑 return 对象。如果你只想 return 3 件事,如果你清楚你在做什么,我什至不会费心去创建一个特定的 class。 Kotlin 已经为此设置了 class - 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 个值,我不确定是否已经有一个 class,但总是可以选择使用数组的数组:
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
}))
正如评论中所指出的,这可能会在理解每个值是什么时产生一些问题,因此有时最好创建自己的 class:
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
}))
命名请见谅。这只是一个例子。