본문 바로가기

Pattern/Funtional

RxJava 연산자

반응형

📚 RxJava에서 연산자란?


  1. RxJava에서 연산자란 함수이다.
  2. 연산자를 이용하여 데이터를 생성하고 통지하는 Flowable이나 Observerble 등의 생산자를 생성할 수 있다.
  3. 생산자에서 통지한 데이터를 다양한 연산자를 통하여 데이터를 가공하여 결과값을 만들어 낼 수 있다.

🙋‍♂️ Flowable, Observable 생성 연산자


  • interval
    • 지정한 시간 간격마다 0부터 시작하는 숫자를 통지한다. (Long Type)
    • InitialDelay 파라미터를 사용하여 최초 대기 시간에 대한 대기 시간을 지정할 수 있다.
    • 완료 없이 계속 통지한다.
    • 호출한 스레드와는 별도의 스레드에서 사용된다.
    • Polling 용도의 작업을 사용할 때 활용될 수 있다.
  • range(n, m)
    • 지정한 값(n)부터 m개의 숫자를 통지한다.
    • 반복문을 대체할 수 있다.
  • timer
    • 지정한 시간이 지나면 0을 통지한다.
    • 0을 통지하고 onComplete() 이벤트가 발생하여 종료한다.
    • 호출한 스레드와는 별도의 스레드에서 실행된다.
    • 특정 시간이 지난 후에 어떤 처리를 하고자 할 때 활용할 수 있다.
  • defer
    • 구독이 발생할 때 마다 즉, subscribe()가 호출될 때 마다 새로운 Observable을 생성한다.
    • 선언한 시점의 데이터를 통지하는 것이 아니라, 호출 시점의 데이터를 통지한다.
    • 데이터 생성을 미루는 특성이 있기 때문에 최신의 데이터를 얻을 때 활용된다.
  • fromIterable
    • Iterable 인터페이스를 구현한 클래스를 파라미터로 받는다.
    • Iterable에 담겨져 있는 데이터를 순서대로 통지한다.
  • fromFuture
    • Future 인터페이스는 자바 5에서 비동기 처리를 위해 추가된 동시성 API이다.
    • 시간이 오래 걸리는 작업은 Future를 반환하는 ExecutorService에 맡기고 비동기로 다른 작업을 수행할 수 있다.
    • 자바 8에서는 CompletableFuture 클래스를 통해 구현이 간결해졌다.

🙋‍♂️ Filter 연산자


  • filter
    • 전달 받은 데이터가 조건에 맞는지 확인 후 결과가 true인 데이터만 통지한다.
    • filter라는 단어의 사전적 의미가 무언가를 걸러낸다는 의미이다.
    • 전달받은 Predicate 함수형 인터페이스에서 조건을 확인하다.
  • distinct
    • 이미 통지된 동일한 데이터가 있다면 이 후의 동일한 데이터는 통지하지 않는다.
    • 사전적 의미로는 명확하게 구별되다라는 의미이다.
  • take
    • 파라미터가 지정한 개수나 기간이 될 때까지 데이터를 통지한다.
    • 지정한 범위가 통지 데이터보다 클 경우 데이터를 모두 통지하고 완료한다.
  • takeUntil (첫 번째 유형)
    • 파라미터로 지정한 조건이 true가 될 때까지 데이터를 통지한다.
  • takeUntil (두 번째 유형)
    • 파라미터로 지정한 Observable이 최초 데이터를 통지할 때까지 데이터를 통지한다.
  • skip (첫 번째 유형)
    • 파라미터로 지정한 숫자만큼 건너뛴 후 나머지 데이터를 통지한다.
  • skip (두 번째 유형)
    • 파라미터로 지정한 시간 동안에는 데이터 통지를 건너뛴 후 지정한 시간 이 후, 나머지 데이터를 통지한다.

🙋‍♂️ 데이터 변환 연산자


  • map
    • 원본 Observable에서 통지하는 데이터를 원하는 값으로 변환 후 통지한다.
    • 변환 전, 후 데이터 타입은 달라도 상관없다.
    • null을 반환하면 NullpointException이 발생하므로 null이 아닌 데이터 하나를 반드시 반환해야 한다.
  • flatMap 첫번째 유형
    • 원본 데잍처를 원하는 값으로 변환 후 통지하는 것은 map과 같다.
    • map이 1:1 변환인 것과 달리 flatMap은 1:N 변환하므로 데이터 한개로 여러 데이터를 통지할 수 있다.
    • map은 변환된 데이터를 반환하지만 flatMap은 변환 된 여러개의 데이터를 담고 있는 새로운 Observable을 반환한다.
  • flatMap 두번째 유형
    • 원본 데이터와 변환된 데이터를 조합해서 새로운 데이터를 통지한다.
    • 즉, Observable에 원본 데이터 + 변환된 데이터 = 최종데이터를 실어서 반환한다.
  • concatMap
    • flatMap과 마찬가지로 받은 데이터를 변환하여 새로운 Observable로 반환한다.
    • 반환된 새로운 Observable을 하나씩 순서대로 실행하는 것이 flatMap과 다르다.
    • 즉, 데이터의 처리 순서는 보장하지만 처리 중인 Observable의 처리가 끝나야 다음 Observable이 실행되므로 처리 성능에는 영향을 줄 수 있다.
  • switchMap
    • concatMap과 마찬가지로 받은 데이터를 변환하여 새로운 Observable로 반환한다.
    • concatMap과 다른점은 switchMap은 순서를 보장하지만 새로운 데이터가 통지되면 현재 처리중이던 작업을 바로 중단한다.
  • groupBy
    • 하나의 Observable을 여러개의 새로운 GroupedByObservable로 만든다.
    • 원본 Observable의 데이터를 그룹별로 묶는다기 보다는 각각의 데이터들이 그룹에 해당하는 Key를 가지게 된다.
    • GroupedByObservable은 getKey()를 통해 구분된 그룹을 알 수 있게 해준다.
  • toList
    • 통지 되는 데이터를 모두 List에 담아 통지한다.
    • 원본 Observable에서 완료 통지를 받는 즉시 리스트를 통지한다.
    • 통지되는 데이터는 원본 데이터를 담은 리스트 하나이므로 Single로 반환된다.
  • toMap
    • 통지 되는 데이터를 모두 Map에 담아 통지한다.
    • 원본 observable에서 완료 통지를 받는 즉시 Map을 통지한다.
    • 이미 사용중인 Key를 또 생성하면 기존에 있던 Key와 Value를 덮어쓴다.
    • 통지되는 데이터는 원본 데이터를 담은 Map 하나이므로 Single로 반환된다.

🙋‍♂️ 데이터 결합 연산자


  • merge
    • 다수의 Observable에서 통지된 데이터를 받아서 다시 하나의 Observable로 통지한다.
    • 통지 시점이 다른 Observable의 데이터부터 순차적으로 통지되고 통지 시점이 같을 경우에는 merge()함수의 파라미터로 먼저 지정된 Observable의 데이터부터 통지된다.
    • 전달받은 Predicate 함수형 인터페이스에서 조건을 확인하다.
  • concat
    • 다수의 Observable에서 통지된 데이터를 받아서 다시 하나의 Observable로 통지한다.
    • 하나의 Observable에서 통지가 끝나면 다음 Observable에서 연이어서 통지가 된다.
    • 각 Observable의 통지 시점과는 상관없이 concat() 함수의 파라미터로 먼저 입력된 Observable의 데이터부터 모두 통지 된 후, 다음 Observable의 데이터가 통지된다.
  • zip
    • 다수의 Observable에서 통지된 데이터를 받아서 다시 하나의 Observable로 통지한다.
    • 각 Observable에서 통지된 데이터가 모두 모이면 각 Observable에서 동일한 index의 데이터로 새로운 데이터를 생성한 후 통지한다.
    • 통지하는 데이터 개수가 가장 적은 Observable의 통지 시점에 완료 통지 시점을 맞춘다.
  • combineLatest
    • 다수의 Observable에서 통지된 데이터를 받아서 다시 하나의 Observable로 통지한다.
    • 각 Observable에서 데이터를 통지할 때마다 모든 Observable에서 마지막으로 통지한 각 데이터를 함수형 인터페이스에 전달하고, 새로운 데이터를 생성해 통지한다.

🙋‍♂️ 에러 처리 연산자


  • onErrorReturn
    • 에러가 발생했을 때 에러를 의미하는 데이터로 대체할 수 있다.
    • onErrorReturn()을 호출하면 onError 이벤트는 발생하지 않는다.
  • onErrorResumeNext
    • 에러가 발생했을 때 에러를 의미하는 Observable로 대체할 수 있다.
    • Observable로 대체할 수 있으므로 데이터 교체와 더불어 에러 처리를 위한 추가 작업을 할 수 있다.
  • retry
    • 데이터 통지 중 에러가 발생했을 때, 데이터 통지를 재시도 한다.
    • 즉, onError 이벤트가 발생하면 subscribe()를 다시 호출하여 재구독한다.
반응형

'Pattern > Funtional' 카테고리의 다른 글

Flowable과 Observable  (0) 2021.07.26
Reactive Streams  (0) 2021.07.26
Single, Maybe, Completable  (0) 2021.06.17
RxJava Publisher, Subscriber  (0) 2020.07.23