RxJava2 Итерация списка и вызов одного для каждого элемента - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть таблица базы данных с дружескими соединениями:

Следующий пример - просто Imagined, поэтому, пожалуйста, не предлагайте мне реализовать это по-другому.

FriendConnection:

  • id
  • humanId

У меня есть список с этими идентификаторами.

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 и сделать одиночный вызов для каждого Человека.Чем мне нужно сопоставить FriendConnection с новым экземпляром Human для экземпляра 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, а не с комнатой)

enter image description here

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Подходит ли вам это решение?

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()))
0 голосов
/ 21 ноября 2018

Вы могли бы сделать что-то вроде этого,

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