RxJava过滤空列表并使用firstOrDefault

时间:2017-09-08 11:14:09

标签: 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永远不会运行。但为什么?它清楚地表明,如果前面的observable没有发出任何内容,它会返回默认值。

2 个答案:

答案 0 :(得分:5)

如果流完成,则

firstOrDefault会发出默认值,而不会通过observable传递任何项目。要让您的信息流完成,BehaviorSubject需要发出完整信号。由于没有任何指示发生,它永远不会意识到它需要发送默认值。

解决方案是将filterfirstOrDefault移至flatMap的内部,以便getData提供的列表末尾最终完成内部流。

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

答案 1 :(得分:0)

public Observable<Item> getInboxItem(String id) {
    return inboxData
        .flatMap(response -> Observable.from(response.getData()))

此时,response.getData()返回null,对吗?

        .filter(item -> item.getId().equals(id))

这意味着此处的item为空。因此item.getId()会引发NullPointerException。像这样的错误会立即传递给订阅者的onError处理程序。

firstOrDefault