2016-09-20 4 views
2

Was ist der Idiomatische RxJava-Weg zu entdecken, wenn ein Set 0 Elemente erreicht hat?RxJava: Achten Sie darauf, dass der Satz 0 Elemente erreicht

ich an dieser Antwort ausgesehen haben: How can I create an Observer over a dynamic list in RxJava?, und ich kann sehen, wie ich ObservableHashSet, ein HashSet mit einem benutzerdefinierten wickeln konnte und dann in der Methode remove(), wenn die Größe 0, rufen onCompleted.

Ist das der richtige Weg? Gibt es einen einfacheren/integrierten Ansatz?

Antwort

0

Siehe Blocking Observable Operators Wiki-Seite von rxJava.

Durch die Verwendung von first( ) und firstOrDefault( ), können Sie:

  • erste() - Block, bis die beobachtbare ein Element emittiert, dann wieder das erste Element emittiert von der beobachtbare

  • firstOrDefault() - Blockieren, bis der Observable einen Gegenstand ausgibt oder vervollständigt, dann den Tannenbaum zurückgeben st Artikel durch die beobachtbaren oder einem Standardelement emittiert wird, wenn die beobachtbare kein Element hat emittieren

Ich hoffe, dass es Ihnen hilft.

+1

Dank @pRaNaY, wahrscheinlich aufgrund meiner Neuheit zu RxJava, sehe ich nicht, wie Sie Ihren Vorschlag in der Lösung der Frage verwenden. – mtyson

+0

Ich kann nicht sehen, wie es auch hilft. –

1

Ziemlich viel.

Obwohl Sie einen Dekorateur schreiben könnten, und unmodifizierte Methoden unverändert zu delegieren. Dann können Sie es auf TreeSet usw. verwenden

Auch könnten Sie vielleicht nur sizeAsObservable() (size() genommen wird) hinzu: Und dann können Sie das filtern.

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()); 
    } 

    ... 
} 

... und Filter nur für 0, wenn Sie nur das Leergut wollen, und das erste Ergebnis überspringen, wie Sie sagten, Sie nur daran interessiert waren, als der Satz leer ist.

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

Andernfalls, wenn Sie die Kontrolle über Umzüge haben, überprüfen Sie nur dann oder es dort verfolgen!

Verwandte Themen