编程语言
首页 > 编程语言> > RxJava过滤空列表并使用firstOrDefault

RxJava过滤空列表并使用firstOrDefault

作者:互联网

我正在尝试过滤一个列表,该列表可能是空的(或者该项不在列表中). 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没有发出任何内容,它会返回默认值.

解决方法:

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

解决方案是将filter和firstOrDefault移动到flatMap的内部,以便getData提供的列表末尾最终完成内部流.

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

标签:rx-java2,android,java,list,rx-java
来源: https://codeday.me/bug/20190828/1750501.html