java - RxJava 过滤空列表并使用 firstOrDefault

标签 java android list rx-java rx-java2

我正在尝试过滤可能为空或可能不为空的列表(或者该项目不在列表中)。 inboxData 由另一个 observable 填充:

private BehaviorSubject<InboxResponse> inboxData = BehaviorSubject.create();

public Observable<Item> getInboxItem(String id) {
    return inboxData
        .flatMap(response -> Observable.from(response.getData()))
        .filter(item -> item.getId().equals(id))
        .firstOrDefault(null);
}

在这种情况下,如果 response.getData() 为空,则 firstOrDefault 永远不会运行。但为什么?它清楚地表明,如果前面的可观察对象什么都不发出,它会返回默认值。

最佳答案

firstOrDefault 如果流完成 而没有任何项目通过可观察对象传递,则发出默认值。为了让您的流完成 BehaviorSubject 需要发出完成信号。由于没有迹象表明会发生这种情况,因此它永远不会意识到它需要发送默认值。

解决方案是将filterfirstOrDefault 移动到flatMap 的内部,这样 提供的列表的末尾getData 最终完成内部流。

请注意,如果您按照标签的建议使用 RxJava2,null 永远不会成为流中的项目,因此将其作为默认值传递会导致异常。

关于java - RxJava 过滤空列表并使用 firstOrDefault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46115206/

相关文章:

java - 将 RxJava Emissions 写入文本文件的有效方法?

java - 如何分配多维输出缓冲区来提供 Android Tflite 的 interpreter.run()?

android - 创建安卓模拟器的问题

android - Cordova 应用程序在 Android 应用程序的数据空间上使用 AJAX 保存 DOM 加载数据

java - Android 中的 Volley API 有什么用?

java - Android 将图像异步加载到 ListView ?

java - 如何编写一个以 fragment 类作为参数的方法,该方法将允许我创建该 fragment 的新实例?

java - 如何将列表中的get(0)转换为常量并获取值

python - 列表中的空格

list - 尾递归List.map