RxJava:注意设置达到0个元素

时间:2016-09-20 13:55:18

标签: java rx-java

当Set达到0个元素时,发现什么是RxJava惯用方法?

我看过这个答案:How can I create an Observer over a dynamic list in RxJava?,我可以看到如何使用自定义HashSet包装ObservableHashSet,然后在remove()方法中,如果大小为0,请致电onCompleted

这是正确的方法吗?是否有更简单/内置的方法?

2 个答案:

答案 0 :(得分:1)

非常。

虽然你可以写一个装饰器,并且不修改委托未修改的方法。然后你可以在TreeSet等上使用它。

另外,也许您可​​以添加sizeAsObservable()(大小()() 然后你可以过滤它。

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)

否则,如果您可以控制删除,只需检查或在那里跟踪它!

答案 1 :(得分:0)

请参阅rxJava的Blocking Observable Operators wiki页面。

使用 first( ) firstOrDefault( ) ,您可以:

  • first() - 阻止直到Observable发出一个项目,然后返回Observable发出的第一个项目

  • firstOrDefault() - 阻止直到Observable发出项目或完成,然后返回Observable发出的第一个项目或者如果Observable没有发出项目则返回默认项目

我希望它对你有帮助。