объединить два списка и отобразить новый объект класса с помощью rxjava - PullRequest
0 голосов
/ 09 ноября 2018

Рассмотрим следующий вход: вызов сетевого вызова вернет объект клиента

data class Client(
val name: String,
val phoneNumber: String,
val frequentContacts: List<String>,
val allContacts: List<String>
)

Мне нужно сопоставить похожие имена в списке рассылки часто встречающихся и всех контактов в новом объекте и подписаться на вывод.

предположим, что ответ от сетевого вызова вернет этот клиентский объект

{
"name": "Jack",
"phoneNumber": "90284302424",
"frequentContacts": [
    "John",
    "Sam"
    ],
"allContacts": [
    "John",
    "Adam",
    "Peter",
    "Kim",
    "Sam"
    ]
}

что мне нужно получить при подписке на вновь создаваемый объект.

data class clientViewModel(val name: String,val isFrequent: Boolean)

поэтому в onSuccess у меня должен быть экземпляр из clientViewModel

Ожидаемый результат:

(«Джон», правда »)

(«Адам», ложь »)

(«Петр», ложь »)

("Ким", ложь ")

("Сэм", правда ")

вот что я до

clientRepository.getClientById(clientId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doAfterTerminate { view.hideProgress() }
.flatMap{it.frequentContacts}
.subscribe{
onSuccess(item: ClientViewModel){}
onError(){}
onFinish(){}
}

но это не работает, потому что как только я использую плоскую карту, я теряю список всех контактов любая помощь ?

Я читал об операторе GroupBy, но я использую Single ...

1 Ответ

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

Честно говоря, я бы просто сделал это:

clientRepository.getClientById(clientId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doFinally { view.hideProgress() }
.map { client ->
    client.allContacts.map { contact ->
        clientViewModel(name = contact, isFrequent = client.frequentContacts.contains(contact))
    }
}
.subscribeBy(onSuccess = { list: List<clientViewModel> -> 
    ...
}, onError = { err -> ... })
...