2017-09-08 6 views
2

空であってもなくてもよいリストをフィルタリングしようとしています(またはリストにないアイテム)。 inboxDataは別のオブザーバブルで埋められます。RxJavaの空リストのフィルタリングとfirstOrDefaultの使用

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は実行されません。しかし、なぜ?それは、先行する観測値が何も出さない場合、デフォルト値を戻すことを明確に示しています。

+0

@ Kiskaeの答えは正しいです。また、 'BehaviorSubject'で' onCompleted'を呼び出すと、以降のオブザーバーは 'onCompleted'だけを受け取ることになります。決してデータはありません。私は '科目'があなたがここで探しているものであるかどうか分からない。 – theFunkyEngineer

答えて

3

firstOrDefaultストリームが観測を通過する任意の項目なしを完了した場合、デフォルトを発します。あなたのストリームが完了するように、BehaviorSubjectは完了を知らせる必要があります。起こっていることの表示がないので、デフォルトを送信する必要があることは決してわかりません。

溶液は、flatMapの内部にfilterfirstOrDefaultを移動させることであるのでgetDataによって提供されたリストの終わりには、内側ストリームを完了してしまいます。

タグとしてRxJava2を使用している場合、nullはストリーム内のアイテムになることはありません。したがって、デフォルトとして渡すと例外が発生することに注意してください。

+0

ありがとう、onCompleteについて何かを考えました! – breakline

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はnullです。従ってitem.getId()NullPointerExceptionをスローします。そのようなエラーは、すぐにサブスクライバのonErrorハンドラに渡されます。ストリームがすぐに終了するので、firstOrDefaultメソッドはもはや呼び出されません。

 .firstOrDefault(null); 
} 
+0

いいえ、response.getData()は空のリストです。データがない場合 – breakline

+0

behavioursubjectについての何かがoncompleteを呼び出すとは思わないので、firstOrDefaultはデフォルトの部分を呼び出すことができません。 – breakline

関連する問題