如何使用RxJava2和RxAndroid获取有条件的Map?

时间:2018-01-23 09:17:33

标签: java android rx-java rx-java2 rx-android

所以,我已根据对象的条件列表进行排序

private Observable<CallServiceCode> getUnansweredQuestionList() {
    return Observable.fromIterable(getServiceCodeArrayList())
               .subscribeOn(Schedulers.computation())
               .filter(iServiceCode -> iServiceCode.getServiceCodeFormStatus().isUnanswered());
}

现在我需要做什么:

每个对象都有列表servicePartList,我需要按条件筛选此列表,最后如果此筛选列表的最终大小为>0,那么我需要添加包含此列表的对象{{1} }作为键,将此筛选列表作为值。

所以它应该是这样的:

CallServiceCode object

但是在RxJava2中没有这样的方法private Map<CallServiceCode, ArrayList<CallServicePart>> getSortedMap() { Map<CallServiceCode, ArrayList<CallServicePart>> result = new HashMap<>(); getUnansweredQuestionList() .filter(callServiceCode -> Observable.fromIterable(callServiceCode.getCallServicePartList()) // .filter(servicePart -> servicePart.getServicePartFormStatus().isUnanswered())// .isNotEmpty()) .subscribe(callServiceCode -> result.put(callServiceCode, Observable.fromIterable(callServiceCode.getCallServicePartList()) // .filter(servicePart -> servicePart.getServicePartFormStatus().isUnanswered())); return result; } ,并且添加这样的键是不对的:

isNotEmpty()

所以问题是如何正确地做到这一点?

1 个答案:

答案 0 :(得分:1)

一种解决方案可能是使用collect直接从observable创建Map

return getUnansweredQuestionList()
        .collect(HashMap<CallServiceCode, List<CallServicePart>>::new,(hashMap, callServiceCode) -> {
            List<CallServicePart> callServiceParts = Observable.fromIterable(callServiceCode.getServicePartList())
                        .filter(s -> !s.getServicePartFormStatus().isUnanswered())
                        .toList().blockingGet();
            if (!callServiceParts.isEmpty())
                hashMap.put(callServiceCode, callServiceParts);
        }).blockingGet();

如果您将过滤提取到方法中(也可能是CallServiceCode的成员),那么代码会更清晰:

return getUnansweredQuestionList()
           .collect(HashMap<CallServiceCode, List<CallServicePart>>::new, (hashMap, callServiceCode) -> {
               List<CallServicePart> filteredParts = getFilteredServiceParts(callServiceCode.getServicePartList());
               if (!filteredParts .isEmpty())
                   hashMap.put(callServiceCode, filteredParts);
            }).blockingGet();