RxJava2迭代列表并为每个项目调用单个

时间:2018-11-21 10:07:48

标签: kotlin rx-java2

我有一个带有好友连接的数据库表:

下一个示例仅是Imagined的示例,因此请不要建议我以其他方式实现它。

FriendConnection:

  • id
  • humanId

我有一个带有这些ID的列表。

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>

所以我需要迭代friendConnections并为每个人类进行一次呼叫。比我需要将带有新的Human实例的FriendConnection映射到Friend实例。

我尝试过,但是不起作用:

Observable.fromIterable(arrayListOf(
                FriendConnection(id=10, humanId=141),
                FriendConnection(id=13, humanId=142)
        ))
                .flatMapSingle { friendConnection ->
                    repository.getHumanById(friendConnection.humanId)
                            ?.map {human ->
                                Friend(friendConnection.id,friendConnection.humanId,human)
                            }
                }
                .toList()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({ it ->
                    Timber.i("friendList is here: $it")
                }, {
                    throw it 
                })

有人知道怎么了? (我想用Rx而不是Room来实现)

enter image description here

2 个答案:

答案 0 :(得分:0)

您可以这样做,

Observable.fromIterable(friendConnections)
        .flatMap { Observable.just(Friend(it.id, it.humanId, repository.getHumanById(it.humanId).blockingGet())) }
        .toList()
        .subscribe {it --> /*Your Operation*/

答案 1 :(得分:0)

此解决方案适合您吗?

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