본 내용은 필자가 학습한 내용을 정리하는 내용입니다. 대부분 의 내용이 아래 책의 내용이므로 원서를 구매해서 직접보시는걸 추천드립니다! RxJava 프로그래밍 리액티브 프로그래밍 기초부터 RxAndroid까지 한 번에 저자님의 블로그 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() 함수를 활용한 예
CommonUtils.sleep(1000);
실행결과
RxComputationThreadPool-2 | value = 6
마블 다이어 그램을 보면 빨강부터 분홍까지 모두 true를 발행합니다.
all() 함수의 원형
public final Single<Boolean> all(Predicate<? super T> predicate)
predicate 인자는 filter() 함수의 인자와 동일합니다. 주어진 람다 표현식이 true인지 false 인지를 판정해 주어야 합니다.
all() 함수의 활용 예
source.subscribe(Log::i);
data배열에서 값을 받아서 map() 함수 안에서 Shape클래스의 getShape메소드를 이용해 원 모양인지 판별합니다.
만약 all() 함수에 들어가는 predicate인자를 전통적인 람다 표현식으로 표현한다면
아래와 같습니다.
//.all(val->Shape.BALL.equals(Shape.getShape(val)));
하지만 위의 코드에서는
.all(Shape.BALL::equals);
다음처럼 2개로 구분하여 표현했습니다.
이형태는 자바 8에서 제공하는 메소드 레퍼런스를 활용한 것입니다.
메소드 레퍼런스는 val->Object.function(val)을 축약해 놓은 것으로 공통되는 인자를 제거하여 object::function과 같은 형태로 단순화 할 수 있습니다.
실행결과
main | value = true
'Rx' 카테고리의 다른 글
스케줄러란? (0) | 2018.12.27 |
---|---|
리액티브연산자[수학 및 기타연산자]- 19(수학, delay, timeInterval 함수) (0) | 2018.12.27 |
리액티브연산자[조건 연산자]- 17(amb함수,takeUntil함수) (0) | 2018.12.27 |
리액티브연산자[결합 연산자]- 16(merge함수,concat함수) (0) | 2018.12.27 |
리액티브연산자[결합 연산자]-15(combineLatest함수) (0) | 2018.12.27 |
댓글