合并两个列表并使用rxjava

时间:2018-11-09 18:56:09

标签: kotlin rx-java2

考虑以下输入:呼叫网络呼叫将检索客户端对象

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的实例

预期输出:

(“约翰”,是“

(“ Adam”,false“)

(“彼得”,假“)

(“金”,假“)

(“ Sam”,是“

这是我要做什么

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 :(得分:0)

老实说,我会这样做:

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 -> ... })