RxJava 过滤空列表并使用 firstOrDefault
RxJava filtering empty list and using 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 永远不会运行。但为什么?它清楚地表明,如果前面的可观察对象什么都不发出,它会返回默认值。
public Observable<Item> getInboxItem(String id) {
return inboxData
.flatMap(response -> Observable.from(response.getData()))
此时,response.getData() returns null,对吧?
.filter(item -> item.getId().equals(id))
也就是说这里的item
为空。所以 item.getId()
抛出一个 NullPointerException
。这样的错误会立即传递给订阅者的 onError 处理程序。 firstOrDefault
方法甚至不会再被调用,因为流会立即终止。
.firstOrDefault(null);
}
firstOrDefault
如果流 完成 而没有任何项目通过可观察对象传递,则发出默认值。要使您的流完成,BehaviorSubject
需要发出完成信号。由于没有迹象表明会发生这种情况,因此它永远不会意识到它需要发送默认值。
解决方案是将 filter
和 firstOrDefault
移动到 flatMap
的内部,这样 getData
提供的列表的末尾就完成了内部流。
请注意,如果您按照标签建议使用 RxJava2,null
永远不会成为流中的项目,因此将其作为默认值传递会导致异常。
我正在尝试过滤可能为空或可能不为空的列表(或者该项目不在列表中)。 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 永远不会运行。但为什么?它清楚地表明,如果前面的可观察对象什么都不发出,它会返回默认值。
public Observable<Item> getInboxItem(String id) {
return inboxData
.flatMap(response -> Observable.from(response.getData()))
此时,response.getData() returns null,对吧?
.filter(item -> item.getId().equals(id))
也就是说这里的item
为空。所以 item.getId()
抛出一个 NullPointerException
。这样的错误会立即传递给订阅者的 onError 处理程序。 firstOrDefault
方法甚至不会再被调用,因为流会立即终止。
.firstOrDefault(null);
}
firstOrDefault
如果流 完成 而没有任何项目通过可观察对象传递,则发出默认值。要使您的流完成,BehaviorSubject
需要发出完成信号。由于没有迹象表明会发生这种情况,因此它永远不会意识到它需要发送默认值。
解决方案是将 filter
和 firstOrDefault
移动到 flatMap
的内部,这样 getData
提供的列表的末尾就完成了内部流。
请注意,如果您按照标签建议使用 RxJava2,null
永远不会成为流中的项目,因此将其作为默认值传递会导致异常。