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
 }))

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