java - 如何使用 RxJava 和 RxAndroid 获取带条件的 map ?

标签 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,所以我需要添加对象包含此列表 CallServiceCode 对象 作为键,此过滤列表作为值。

所以应该是这样的:

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;
}

但是RxJava2中没有isNotEmpty()这样的方法,而且这样添加key也是不对的:

Observable.fromIterable(callServiceCode.getCallServicePartList())
    .filter(servicePart -> servicePart.getServicePartFormStatus().isUnanswered())

那么问题是如何正确地制作它?

最佳答案

一个解决方案是使用 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();

关于java - 如何使用 RxJava 和 RxAndroid 获取带条件的 map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48398028/

相关文章:

java - TestScheduler 不适用于 RxJava

java - 字(密码)以星号显示 - 控制台应用程序

java - 如何从超类中选择 child ?

javascript - Android 浏览器中某些键没有按键事件

android - 开发时在未 root 的真实设备上的 system/priv-app 文件夹中运行应用程序

kotlin - 可观察到在没有订阅者时缓冲项目,然后在订阅时发出它们并清除缓冲区?

android - 为什么 RxJava 经常与 Retrofit 一起使用?

java - 光CP : Timeout after 30000 waiting for a connection

Java检测音频文件(mp3)

android - 在 PC 上测试 opengles 程序