이번 포스트에서는 분류 연산자
에 대해 정리하겠습니다.
분류 연산자는 통지된 데이터를 필터링 해주는 연산자입니다.
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 실행결과
distinct
distinct는 이전에 전달한 데이터는 전달하지 않게 해주는 연산자 입니다.
fun main() {
// distinct 예시
Observable.just(1, 1, 2, 1, 2, 3) // 1, 2, 3
.distinct()
.subscribe(::println)
}
실행결과
distinctUntilChanged
distinctUntilChanged
는 중복이 연속으로 일어나는 것만 제한해주는 연산자입니다.
fun main() {
// distinctUntilChanged
Observable.just(1, 2, 2, 3, 1, 1, 1, 2)
.distinctUntilChanged()
.subscribe { println(it) }
}
실행결과
filter
filter
는 데이터가 조건에 맞는지 판정해 결과가 true인 것만 통지하는 연산자입니다.
fun main() {
// filter 예시
Observable.just(1, 1, 2, 1, 2, 3)
.filter { it % 2 == 1 }
.subscribe { println(it) }
}
실행결과
ofType
ofType
은 특정 타입(클래스)만 전달하는 연산자입니다.
fun main() {
// ofType 예시
Observable.just(1, "Hello", true, 2f)
.ofType(String::class.java)
.subscribe(::println)
}
실행결과
ignoreElements
ignoreElements
는 모든 데이터를 무시하고 Completable을 리턴하는 연산자입니다.
Observable을 단지 Completable로 받고 싶을 때 사용합니다. (꽤 많이 쓰입니다.)
fun main() {
// ignoreElements 예시
Observable.just(1, 1, 2, 1, 2, 3)
.ignoreElements()
.subscribe { println("complete") }
}
실행결과
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
은 맨 앞에 n개의 데이터를 건너 뛰고 싶을때 사용하는 연산자입니다.
fun main() {
// skip 예시
Observable.just(1, 1, 2, 1, 2, 3)
.skip(2)
.subscribe { println(it) }
}
실행결과
take
take
는 n개의 데이터만 전달하는 연산자입니다.
fun main() {
// take 예시
Observable.just(1, 1, 2, 1, 2, 3)
.take(2)
.subscribe { println(it)}
}
실행결과