You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RxJava:如何在函数的Single中返回两个以上的ArrayList

嘿,作为RxJava新手碰到这种问题太正常啦!Pair确实只能承载两个元素,要传递两个以上的列表,这里有几个实用的解决方案,结合你的代码给你演示下:

1. 自定义数据类(最推荐,语义拉满)

Kotlin的数据类天生就是用来封装关联数据的,可读性超强,后续扩展也方便。先定义一个专门的类来装你的三个联系人列表:

// 给每个列表起个有意义的名字,别人看代码一眼就懂
data class ContactGroups(
    val primaryContacts: ArrayList<Contact>,
    val secondaryContacts: ArrayList<Contact>,
    val tertiaryContacts: ArrayList<Contact>
)

然后修改ViewModel里的方法,返回这个数据类的Single:

fun loadAll(contact: String?): Single<ContactGroups> {
    return packageDB.loadAll()
        .map { table ->
            val primary = ArrayList<Contact>()
            val secondary = ArrayList<Contact>()
            val tertiary = ArrayList<Contact>()
            // 这里可以添加填充三个列表的业务逻辑
            ContactGroups(primary, secondary, tertiary)
        }
}

最后在Fragment里调用,直接通过属性名获取对应列表,清晰又不容易错:

disposables.add(
    viewModel.loadAll(contact)
        .subscribe({ groups ->
            val firstList = groups.primaryContacts
            val secondList = groups.secondaryContacts
            val thirdList = groups.tertiaryContacts
            // 这里写你的列表处理逻辑
        }, { error ->
            // 别忘了处理错误哦!RxJava里错误回调很重要
            // 比如Toast提示、日志打印
        })
)

这个方案的好处是语义清晰,以后要加第四个列表,直接给数据类加个属性就行,扩展性拉满。

2. 用Kotlin内置的Triple(适合刚好三个元素的场景)

如果你的需求就是固定三个列表,不想自定义类,可以用Kotlin标准库自带的Triple类,它和Pair类似,但支持三个元素:
修改ViewModel方法:

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

Fragment调用:

disposables.add(
    viewModel.loadAll(contact)
        .subscribe({ triple ->
            val firstList = triple.first
            val secondList = triple.second
            val thirdList = triple.third
        }, { error ->
            // 错误处理不能忘
        })
)

这个方案不用自己写类,适合临时场景,但缺点是语义不够明确(first/second/third不如自定义属性名好懂),而且以后要加第四个元素就没法用了。

3. 用List<List>(适合数量不固定的情况)

如果你的列表数量是动态的,或者不确定以后会加多少个,可以把所有列表放到一个大的List里返回:
修改ViewModel方法:

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

Fragment调用:

disposables.add(
    viewModel.loadAll(contact)
        .subscribe({ lists ->
            val firstList = lists[0]
            val secondList = lists[1]
            val thirdList = lists[2]
        }, { error ->
            // 错误处理
        })
)

这个方案适合列表数量不确定的场景,但缺点是需要记住每个索引对应的列表,可读性较差,容易出现索引越界的问题,除非你有明确的动态需求,否则不推荐。


内容的提问来源于stack exchange,提问作者Anshul Tyagi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 15:47:53