본문 바로가기
Rx

리액티브연산자[생성연산자]-9(intervalRange함수)

by 봄석 2018. 12. 26.

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

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

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

 




생성연산자- intervalRange()함수

intervalRange() 함수는 interval()과 range()를 혼합해 놓은 함수입니다.

interval() 함수처럼 일정한 시간 간격으로 값을 출력하지만 range() 함수처럼 시작 숫자(n)로 부터 m개만큼의 값만 생성하고 onComplete 이벤트가 발생합니다. 즉 , interval() 함수처럼 무한히 데이터 흐름을 발행하지 않습니다. 리턴타입은 interval() 함수와 동일한 Long 타입입니다.


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

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



intervalRange()함수의 원형은 다음과 같습니다.


@ShcedulerSupprot(SchedulerSupport.COMPUTATION)
public static Observable<Long> intervalRange(long start,
 long count,
 long initialDelay,
 long period,
 TimeUnit unit){}

intervalRange() 함수는 interval() 함수와 range() 함수를 혼합한 형태이기 때문에 계산 스케줄러에서 실행된다는 점이 같습니다. 사실 인자 개수가 많아 직관적이지는 않습니다.


intervalRange() 함수의 활용 예


Observable<Long> source= Observable.intervalRange(1,
                5,
                100L,
                100L,
                TimeUnit.MILLISECONDS);

source.subscribe(Log::i);

 CommonUtils.sleep(1000);


실행결과

RxComputationThreadPool-4 | value = 1
RxComputationThreadPool-4 | value = 2
RxComputationThreadPool-4 | value = 3
RxComputationThreadPool-4 | value = 4

RxComputationThreadPool-4 | value = 5



사실 intervalRange() 함수는 interval()함수와 지금까지 배웠던 다른 함수를 조합하면 만들수 있습니다.

예제 interval()함수로 intervalRange()함수 만들기
Observable<Long> source= Observable.interval(100L, TimeUnit.MILLISECONDS)
                .map(var->var+1)
                .take(5);
source.subscribe(Log::i);
CommonUtils.sleep(1000);


인자가 5개나되는 위의 intervalRange()함수보다 interval(),map(),take()함수를 조합하여 만들어낸 코드가 이해하기 더 쉽고 자연스러워 보입니다.

함수 인자의 개수가 적을수록 그 의미가 더 분명하게 드러나 보입니다.


댓글