티스토리 뷰

반응형

Filter

Observable에서 원하는 데이터만 걸러내는 역할을 합니다.

즉, 필요 없는 데이터는 제거하고 오직 관심 있는 데이터만 filter 함수를 통과하게 됩니다.

 

 

위 다이어그램을 보면 원 만 통과시키는 것을 볼 수 있습니다.

 

 

입력

import io.reactivex.Observable

class FilterExample {
    fun marbleDiagram() {
        val objs = arrayOf("1 CIRCLE", "2 DIAMOND", "3 TRIANGLE", "4 DIAMOND", "5 CIRCLE", "6 HEXAGON")
        val source = Observable.fromArray(*objs)
            .filter { obj -> obj.endsWith("CIRCLE") }
        source.subscribe { data -> println(data) }
    }
}

fun main() {
    val demo = FilterExample()
    demo.marbleDiagram()
}

 

출력

1 CIRCLE
5 CIRCLE

 

filter 함수에는 boolean 값을 리턴하는 함수형 인터페이스인 Predicate를 인자로 넣습니다.

 

 

아래는 filter 함수를 이용한 짝수 필터링입니다.

 

입력

import io.reactivex.Observable

class FilterExample {
    fun evenNumbers() {
        val data = arrayOf(100, 34, 27, 99, 50)
        val source = Observable.fromArray(*data)
            .filter { number -> number % 2 == 0 }
        source.subscribe { data -> println(data) }
    }
}

fun main() {
    val demo = FilterExample()
    demo.evenNumbers()
}

 

출력

100
34
50

 

아래는 filter와 비슷한 함수들을 정리한 것입니다.

 

 

  • first(default) 함수 - Observable의 첫 번째 값을 필터 함. 만약 값 없이 완료되면 기본 값을 리턴한다.
  • last (default) 함수 - Observable의 마지막 값을 필터 함. 만약 값 없이 완료되면 기본 값을 리턴한다.
  • take (N) 함수 - 최초 N개 값만 가져온다.
  • takeLast (N) 함수 - 마지막 N개 값만 필터 한다.
  • skip (N) 함수 - 최초 N개 값을 건너뛴다.
  • skipLast (N) 함수 - 마지막 N개 값을 건너뛴다.

 

 

아래는 위의 함수들을 활용한 코드입니다.

 

입력

import io.reactivex.Observable
import io.reactivex.Single

class FilterExample {fun otherFilters() {
        val numbers = arrayOf(100, 200, 300, 400, 500)
        var single: Single<Int>
        var source: Observable<Int>

        // 1. first
        single = Observable.fromArray(*numbers).first(-1)
        single.subscribe { data -> println("first() value = $data") }

        // 2. last
        single = Observable.fromArray(*numbers).last(999)
        single.subscribe { data -> println("last() value = $data") }

        // 3. take(N)
        source = Observable.fromArray(*numbers).take(3)
        source.subscribe { data -> println("takeLast(3) value = $data") }
        
        // 4. takeLast(N)
        source = Observable.fromArray(*numbers).takeLast(3)
        source.subscribe { data -> println("takeLast(3) value = $data") }

        // 5. skip(N)
        source = Observable.fromArray(*numbers).skip(2)
        source.subscribe { data -> println("skip(2) value = $data") }
        
        // 6. skipLast(N)
        source = Observable.fromArray(*numbers).skipLast(2)
        source.subscribe { data -> println("skipLast(2) value = $data") }
    }
}

fun main() {
    val demo = FilterExample()
    demo.otherFilters()
}

 

출력

first() value = 100
last() value = 500
takeLast(3) value = 100
takeLast(3) value = 200
takeLast(3) value = 300
takeLast(3) value = 300
takeLast(3) value = 400
takeLast(3) value = 500
skip(2) value = 300
skip(2) value = 400
skip(2) value = 500
skipLast(2) value = 100
skipLast(2) value = 200
skipLast(2) value = 300
반응형

'알려주는 이야기 > RxJava' 카테고리의 다른 글

13. RxJava - 생성 연산자  (0) 2020.07.10
12. RxJava - Reduce  (0) 2020.07.09
10. RxJava - FlatMap  (0) 2020.07.09
9. RxJava - Map  (0) 2020.07.09
8. RxJava - ConnectableObservable  (0) 2020.07.09
댓글