2016-09-20 2 views
2

집합이 0 요소에 도달했을 때 RxJava 관용구를 발견하는 방법은 무엇입니까?RxJava : 0 요소에 도달하도록 설정합니다.

나는이 답변 살펴 보았다

: How can I create an Observer over a dynamic list in RxJava?, 그리고 내가 정의 ObservableHashSetHashSet 포장 및 크기가 0이면 다음 제거() 메소드에서, onCompleted를 호출 할 수있는 방법을 볼 수 있습니다.

적절한 방법입니까? 더 단순한/기본 제공 방식이 있습니까?

답변

0

rxJava의 Blocking Observable Operators wiki 페이지를 참조하십시오. first( )firstOrDefault( ) 사용함으로써

다음을 수행 할 수

  • 제() - 관찰 항목을 방출 할 때까지 블록 후 관찰

  • 방출 첫 번째 항목을 리턴
  • firstOrDefault() - Observable에서 항목을 내보내거나 완료 할 때까지 차단 한 다음 전나무를 반환합니다. Observable에서 방출 한 표준 항목 또는 Observable에서 항목을 내 보내지 않은 경우 기본 항목

나는 그것이 당신을 돕기를 바랍니다.

+1

감사합니다 @pRaNaY, 아마 RxJava에 대한 새로운 성향으로 인해 질문을 해결하는 데 귀하의 제안을 사용하는 방법을 알 수 없습니다. – mtyson

+0

나는 그것이 도움이되는 것을 볼 수 없다. –

1

거의.

데코레이터를 작성하고 수정되지 않은 메소드를 변경하지 않고 위임 할 수 있습니다. 그런 다음 TreeSet 등에 사용할 수 있습니다.

또한 sizeAsObservable() (size()가 적용됨)을 추가 할 수도 있습니다. 그런 다음 필터링 할 수 있습니다.

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)

그러지 않으면 다음 확인하거나 거기를 추적!