Kotlin RxJava2迭代列表并为每个项调用single
我有一个包含好友连接的数据库表: 下一个示例只是一个Kotlin RxJava2迭代列表并为每个项调用single,kotlin,rx-java2,Kotlin,Rx Java2,我有一个包含好友连接的数据库表: 下一个示例只是一个想象中的示例,因此请不要建议我以另一种方式实现它 友情连接: 身份证 人文的 我有一张有这些证件的名单 val friendConnections = arrayListOf( FriendConnection(id=10, humanId=141), FriendConnection(id=13, humanId=142) ) 我想用RxJava制作这个结果列表 val friendList = arrayListOf(
想象中的示例,因此请不要建议我以另一种方式实现它
友情连接:
- 身份证
- 人文的
我有一张有这些证件的名单
val friendConnections = arrayListOf(
FriendConnection(id=10, humanId=141),
FriendConnection(id=13, humanId=142)
)
我想用RxJava制作这个结果列表
val friendList = arrayListOf(
Friend(friendConnectionId = 10, humanId = 141, humanInstance = (...)),
Friend(friendConnectionId = 13, humanId = 142, humanInstance = (...))
)
我怎样才能得到一个人类
fun getHumanById(id: Long) : Single<Human>
有人知道怎么了?(我想用Rx实现它,而不是用Room)
你可以这样做
Observable.fromIterable(friendConnections)
.flatMap { Observable.just(Friend(it.id, it.humanId, repository.getHumanById(it.humanId).blockingGet())) }
.toList()
.subscribe {it --> /*Your Operation*/
这个解决方案适合你吗
Observable.fromIterable(
listOf(
FriendConnection(1, 101),
FriendConnection(2, 102)
)
)
.flatMapSingle { connection ->
getHumanById(connection.humanId)
.map { human -> Friend(connection.id, connection.humanId, human) }
}
.toList()
.subscribe { list -> println(list) } //method reference generates error due to methods ambiguity
通过id获取人员的模拟函数:
private fun getHumanById(id: Long): Single<Human> = Single.just(Human(id, id.toString()))
private fun getHumanById(id:Long):Single=Single.just(Human(id,id.toString()))
您得到了什么结果?为什么在repository.getHumanById(friendConnection.humanId)?.map中使用安全调用?如果您有getHumanById(id:Long):单个签名,为什么要使用Rx?您可以使用kotlin操作符本身来实现这一点。您的repository.getHumanById
是否正在调用API?不,这只是一个本地数据库调用。您确定fun getHumanById(id:Long)
返回Single
而不是Single?
(可空类型)?因为在表达式repository.getHumanById(friendConnection.humanId)?.map{…}
问号表示可空类型。True。如果repository.getHumanById
进行API调用,那么它应该是flatMap
。(根据假设更新了答案)没有假设,不管方法在做什么。它返回单个,因此您需要FlatMap。这对我不起作用。我在friendConnection列表中有50个条目,但只有前两次被称为flatMapSingle,为什么?@vihkat,请回答我在问题下的评论。也许问题就在这里。而且,如果我们能知道它为什么不起作用,那就太酷了。编译时错误、运行时错误、意外结果?它可以与模拟一起工作。但是不能使用我的单曲,但我确信它不会返回null,因为我在一个修复ID中烧坏了,这个ID可以正常工作。你完全确定getHumanById
会准确返回Single
?它不是单一的
或单一的
,甚至不是单一的
?是的。我敢肯定
private fun getHumanById(id: Long): Single<Human> = Single.just(Human(id, id.toString()))