본문 바로가기
Rx

리액티브연산자[조건 연산자]- 18(skipUntil함수, all 함수)

by 봄석 2018. 12. 27.

본 내용은 필자가 학습한 내용을 정리하는 내용입니다.

대부분 의 내용이 아래 책의 내용이므로 원서를 구매해서 직접보시는걸 추천드립니다!

RxJava 프로그래밍 리액티브 프로그래밍 기초부터 RxAndroid까지 한 번에

유동환 , 박정준 지음 | 한빛미디어 | 2017년 09월 04일 출간

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788968488658&orderClick=LAV&Kc=


저자님의 블로그

https://brunch.co.kr/@yudong#info




리액티브 연산자(함수) 분류 - 카테고리

연산자 종류 

연산자 함수 

  생성 연산자 


 just(), fromXXX(), create(), interval(), ragne(), timer(),   intervalRange(), defer(), repeat() 


  변환 연산자


 map(),flatMap(), concatMap(), switchMap() , groupBy(),

 scan(), buffer(), window()


  필터 연산자


 filter(), take(), skip(), distinct()


  결합 연산자

 

 zip(), combineLatest(), merge(), concat()

 

  조건 연산자


 amb(), takeUtil(), skipUtil(), all()

 

  에러 처리 연산자 


 onErrorReturn(), onErrorResumeNext(), retry(), retryUntil()


  기타 연산자 

 

 subscribe(), subscribeOn(), observeOn(), reduce(), count()

 




조건연산자란?

조건연산자는 Observable의 흐름을 제어하는 역할을 합니다. 필터연산자가 발행된 값을 채택하느냐 기각하느냐 여부에 초점을 맞춘다면, 조건연산자는 지금까지의 흐름을 어떻게 제어할 것인가에 초점을 맞춥니다.


amb() - 둘중 어느것이든 먼저나오는 Observable을 채택합니다.

takeUntil(other) - other Observable에서 데이터가 발행되기 전까지만 현재 Observable을 채택합니다.

skipUntil(other) - takeUntil(other) 함수와는 반대로 other Observable에서 데이터가 발행될 동안 현재 Observable에서 발행하는 값을 무시합니다.

all() - Observable에 입력되는 값이 모두 특정 조건에 맞을때만 true를 발행합니다. 만약 조건이 맞지않는다면 바로 false를 발행합니다.



조건연산자 - skipUntil()함수

skipUntil() 함수는 takeUntil()과 정반대의 함수입니다. other Observable을 인자로 반환한다는 점은 같지만 Observable에서 데이터를 발행할 때까지 값을 건너뜁니다.


skipUntil() 함수의 마블다이어그램

출처 - http://reactivex.io/RxJava/javadoc/io/reactivex/Observable.html


takeUntil() 함수와는 다르게 other Observable에서 화살표가 나올때 까지는 값을 발행하지 않고 건너뛰다가 other Observable에서 값을 발행하는 순간부터 원래 Observable에서 값을 정상적으로 발행하기 시작합니다.


skipUntil() 함수를 활용한 예

String[] data={"1","2","3","4","5","6"};
        
Observable<String> source=Observable.fromArray(data)
            .zipWith(Observable.interval(100L, TimeUnit.MILLISECONDS),(val,notUsed)->val)
            .skipUntil(Observable.timer(500L,TimeUnit.MILLISECONDS));

source.subscribe(Log::i);

 CommonUtils.sleep(1000);


실행결과

RxComputationThreadPool-2 | value = 5

RxComputationThreadPool-2 | value = 6




조건연산자 - all()함수
all() 함수는 단순합니다. 주어진 조건에 100% 맞을 때만 true값을 발행하고 조건에 맞지 않는 데이터가 발행되면 바로 false값을 발행합니다.

all()함수의 마블다이어그램

마블 다이어 그램을 보면 빨강부터 분홍까지 모두 true를 발행합니다.


all() 함수의 원형

@SchedulerSupport(SchedulerSupport.NONE)

public final Single<Boolean> all(Predicate<? super T> predicate)



predicate 인자는 filter() 함수의 인자와 동일합니다. 주어진 람다 표현식이 true인지 false 인지를 판정해 주어야 합니다.


all() 함수의 활용 예

String[] data={"1","2","3","4"};
Single<Boolean> source= Observable.fromArray(data)
            .map(Shape::getShape)
            .all(Shape.BALL::equals);
                //.all(val->Shape.BALL.equals(Shape.getShape(val)));

 source.subscribe(Log::i);



data배열에서 값을 받아서 map() 함수 안에서 Shape클래스의 getShape메소드를 이용해 원 모양인지 판별합니다. 


만약 all() 함수에 들어가는 predicate인자를 전통적인 람다 표현식으로 표현한다면

아래와 같습니다.

//.all(val->Shape.BALL.equals(Shape.getShape(val)));


하지만 위의 코드에서는 

 .map(Shape::getShape)

 .all(Shape.BALL::equals);


다음처럼 2개로 구분하여 표현했습니다.


이형태는 자바 8에서 제공하는 메소드 레퍼런스를 활용한 것입니다. 

메소드 레퍼런스는 val->Object.function(val)을 축약해 놓은 것으로 공통되는 인자를 제거하여 object::function과 같은 형태로 단순화 할 수 있습니다.


실행결과

main | value = true



댓글