[RxJava] 분류 연산자(Filtering Operators)

2021. 4. 9. 12:14·Android/RxJava
반응형

이번 포스트에서는 분류 연산자에 대해 정리하겠습니다.

분류 연산자는 통지된 데이터를 필터링 해주는 연산자입니다.

debounce

 

debounce 마블다이어그램

debounce는 짧은간격으로 연속된 이벤트가 발생하면 데이터를 전달하지 않다가 마지막 데이터가 생성된 후, 일정시간동안 다른 데이터가 생성이 되지 않는다면 데이터를 전달하는 연산자 입니다. e.g) 자동검색 등에 사용

 

첫번째 예시는, interval로 인해 250 밀리초 마다 데이터가 생성이 되고 debounce는 200 밀리초 로 걸려있지만, 200 밀리초 이후 계속 데이터가 들어오게 되므로 모두 정상적으로 구독이 되는 실행결과가 나타납니다.

 

두번째 예시는, interval 대신 intervalRange를 이용하여 250 밀리초 마다 데이터가 생성이 되고 debounce는 300 밀리초로 걸려있으므로, 300 밀리초 이내에 계속 데이터가 들어오게 되므로 마지막 데이터인 5만 출력이 되는 실행결과가 나타나게 됩니다.

이런식으로 짧은시간에 데이터가 전달될 경우 데이터 전달을 방지하고 싶을 때 사용하는데 예를들면 검색창의 자동검색기능 등을 구현할 때 유용합니다. 

fun main() {
    // 첫번째 debounce 예시
    Observable.interval(250L, TimeUnit.MILLISECONDS)
        .debounce(200L, TimeUnit.MILLISECONDS)
        .subscribe(::println)


    // 두번째 debounce 예시
    Observable.intervalRange(0L, 6, 0, 250L,  TimeUnit.MILLISECONDS)
        .debounce(300L, TimeUnit.MILLISECONDS)
        .subscribe(::println)

    Thread.sleep(1500)
}

첫번째 debounce 실행결과

debounce 실행결과1

두번째 debounce 실행결과

distinct

distinct 마블다이어그램

distinct는 이전에 전달한 데이터는 전달하지 않게 해주는 연산자 입니다.

fun main() {
    // distinct 예시
    Observable.just(1, 1, 2, 1, 2, 3) // 1, 2, 3
        .distinct()
        .subscribe(::println)
}

실행결과

Distinct 실행결과

 

 

distinctUntilChanged

distinctUntilChanged 마블다이어그램

distinctUntilChanged는 중복이 연속으로 일어나는 것만 제한해주는 연산자입니다.

fun main() {
    // distinctUntilChanged
    Observable.just(1, 2, 2, 3, 1, 1, 1, 2)
        .distinctUntilChanged()
        .subscribe { println(it) }
}

실행결과

distinctUnitlChanged 실행결과

filter

filter 마블다이어그램

filter는 데이터가 조건에 맞는지 판정해 결과가 true인 것만 통지하는 연산자입니다.

fun main() {
    // filter 예시
    Observable.just(1, 1, 2, 1, 2, 3)
        .filter { it % 2 == 1 }
        .subscribe { println(it) }
}

실행결과

filter 실행결과

ofType

ofType 마블다이어그램

ofType은 특정 타입(클래스)만 전달하는 연산자입니다.

fun main() {
    // ofType 예시
    Observable.just(1, "Hello", true, 2f)
        .ofType(String::class.java)
        .subscribe(::println)
}

실행결과

ofType 실행결과

ignoreElements

ignoreElements 마블다이어그램

ignoreElements는 모든 데이터를 무시하고 Completable을 리턴하는 연산자입니다.

Observable을 단지 Completable로 받고 싶을 때 사용합니다. (꽤 많이 쓰입니다.)

fun main() {
    // ignoreElements 예시
    Observable.just(1, 1, 2, 1, 2, 3)
       .ignoreElements()
       .subscribe { println("complete") }
}

실행결과

ignoreElements

throttleFirst

throttleFirst 마블다이어그램

throttleFirst는 일정시간 들어온 데이터 중 첫번째 데이터만 전달해주는 연산자입니다. e.g) 다중 클릭 이벤트들을 방지에 사용

 

예시는 interval 연산자로 100 밀리초마다 데이터가 전달되고 500 밀리초의 throttleFirst가 걸려있습니다.

 

0와 6가 출력된 이유는 아래와 같습니다.

0에서 throttle이 걸리고 -> (0, 1, 2, 3, 4) 중 첫 번째 데이터인 0이 출력

6에서 throttle이 걸리고 -> (6, 7, 8, 9) 중 첫 번째 데이터인 9가 출력

fun main() {
    // throttleFirst 예시
    Observable.interval(0, 100, TimeUnit.MILLISECONDS)
        .throttleFirst(500, TimeUnit.MILLISECONDS)
        .subscribe {
            println(it)
        }
    Thread.sleep(1000)
}

실행결과

throttleLast

throttleLast는 일정시간 들어온 데이터 중 마지막 데이터만 전달해주는 연산자입니다.

 

예시는 interval 연산자로 100 밀리초마다 데이터가 전달되고 500 밀리초의 throttleLast가 걸려있습니다.

 

4와 9가 출력된 이유는 아래와 같습니다.

0에서 throttle이 걸리고 -> (0, 1, 2, 3, 4) 중 마지막 데이터인 4가 출력

6에서 throttle이 걸리고 -> (6, 7, 8, 9) 중 마지막 데이터인 9가 출력

fun main() {
    // throttleLast 예시
    Observable.interval(0, 100, TimeUnit.MILLISECONDS)
        .throttleLast(500, TimeUnit.MILLISECONDS)
        .subscribe {
            println(it)
        }
    Thread.sleep(1000)
}

실행결과

skip

skip 마블다이어그램

 

skip은 맨 앞에 n개의 데이터를 건너 뛰고 싶을때 사용하는 연산자입니다.

fun main() {
    // skip 예시
    Observable.just(1, 1, 2, 1, 2, 3)
        .skip(2)
        .subscribe { println(it) }
}

실행결과

take

take는 n개의 데이터만 전달하는 연산자입니다.

take 마블다이어그램

 

fun main() {
    // take 예시
    Observable.just(1, 1, 2, 1, 2, 3)
        .take(2)
        .subscribe { println(it)}
}

실행결과

take 실행결과

반응형
'Android/RxJava' 카테고리의 다른 글
  • [RxJava] RxJava retryWhen으로 예외발생시 일정시간 간격으로 재시도 처리하기(retryWithDelay)
  • [RxJava] 조합 연산자(Combining Operators)
  • [RxJava] 변환 연산자(Transforming Operators)
  • [RxJava] 생성 연산자(Creating Operators)
seunghwaan
seunghwaan
공부한 내용을 정리하는 개발 기록 블로그
    반응형
  • seunghwaan
    SH's Devlog
    seunghwaan
  • 전체
    오늘
    어제
    • 분류 전체보기 (148)
      • Android (62)
        • Basic (17)
        • Kotlin(Java) (14)
        • UI & Animation (1)
        • Compose (2)
        • Coroutines (1)
        • Dependency Injection (6)
        • RxJava (8)
        • BLE (3)
        • TDD (2)
        • JetPack (1)
        • NextStep (4)
        • Error Log (3)
      • Flutter (14)
        • Basic (5)
        • Dart (1)
        • State Management (2)
        • Widgets (4)
        • Error and Tips (2)
      • iOS (8)
        • Basic (0)
        • Swift (8)
      • Web Frontend (4)
        • JavaScript(TS) (4)
        • React (0)
      • CS(Computer Science) (18)
        • Network (4)
        • Database (10)
        • Design Pattern (1)
        • Computer Architecture (3)
        • Operating System (0)
      • Cloud (6)
        • AWS (6)
      • DevOps (25)
        • GIT (4)
        • CI CD (8)
        • Linux (4)
        • Docker (9)
        • Error Log (0)
      • 코딩테스트 (10)
        • DB (6)
        • 알고리즘 (4)
      • Backend (1)
        • Spring (1)
      • Mac Tip (0)
      • Language (0)
        • English (0)
        • Japanese (0)
      • Temporary (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    상태 관리
    컴퓨터공학
    cs
    Algorithm
    Dependency Injection
    Computer Science
    AWS
    BLE
    시작하세요! 도커
    database
    네트워크
    Dagger
    Linux
    cognito
    CICD
    docker
    IOS
    Network
    RxJava
    error
    FLUTTER
    di
    CI
    JavaScript
    Swift
    gradle
    Kotlin
    Android
    MySQL
    Jenkins
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
seunghwaan
[RxJava] 분류 연산자(Filtering Operators)
상단으로

티스토리툴바