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
相关产品推荐
相关产品推荐

