2016-09-20 9 views
2

Setが0個の要素に達したときにRxJavaの慣用方法で検出するものは何ですか?RxJava:0個の要素に到達するように設定する時計

私はこの答えを見てきました

How can I create an Observer over a dynamic list in RxJava?、と私はカスタムObservableHashSetHashSetをラップし、サイズが0であれば、その後のremove()メソッドでは、onCompletedを呼び出すことができるか見ることができます。

これは正しい方法ですか?よりシンプルな/組み込みのアプローチはありますか?

答えて

0

rxJavaのBlocking Observable Operators wikiページを参照してください。あなたができるfirst( )firstOrDefault( )を用いて

  • 最初の() - ブロック観測が観察

  • によって放出された最初の項目を返し、その後、アイテムを発するまで
  • firstOrDefault() - Observableがアイテムを送信するか、完了するまでブロックし、その後、観察可能な項目

を放出しなかった場合番目の項目は、私はそれはあなたが役立ちます願っています観察可能か、デフォルトの項目で放出されます。

+1

ありがとう@pRaNaY、おそらく私のRxJavaの新しさのために、あなたの提案をどのように使って問題を解決するか分かりません。 – mtyson

+0

どのように役立つかわかりません。 –

1

かなりです。

デコレータを作成し、変更されていないメソッドを変更せずにデリゲートすることはできますが、 そして、あなたはそれをフィルタリングすることができます。そして、あなたはおそらく、あなただけsizeAsObservable()(サイズ()取られる)を追加することができ、また、などTreeSet

を使用することができます。

class ObservableSet implements Set<T> { 
    private final Set<T> set; 
    private final BehaviorSubject<T> sizeSubject = BehaviorSubject.create(); // 

    public ObservableSet(Set<T> set) { 
     this.set = set; 
     subject.onNext(set.size()); 
    } 

    public Observable<Integer> sizeAsObservable() { 
     return sizeSubject.asObservable(); 
    } 

    public add(T t){ 
     set.add(t); 
     sizeSubject.onNext(set.size()); 
    } 

    ... 
} 

...とちょうどあなたがちょうど空にしたい場合は、0をフィルタリングし、あなたが唯一のセットが空になったときに興味を持っていた言ったように、最初の結果をスキップします。

obsSet.sizeAsObservable().skip(1).filter(size -> size == 0)

あなたが削除を管理している場合はそれ以外の場合は、ちょうどそのチェックまたはそこにそれを追跡!

関連する問題