すわりんのブログ

androidとかサブカルとかのブログです

RxでHotObservableとFilter

RxにはHotObservableとColdObservableがある。 HotObservableについてはそんなもんなあるなーぐらいで 実際に使う機会がなく、あまり理解できてなかった。

rxの使用用途がretrofitを介してのAPIとのやりとりが主だったのも大きい。

んで触る必要が出てきたのでどう動くのかテストしてみた所

    @Test
    fun filterTest() {

        val publisher = PublishSubject.create<String>()

        publisher.onNext("abc")
        publisher.onNext("777")

        //数値のみを出力する
        val numberObserver = publisher.filter {
            try {
                it.toInt()
                true
            } catch (e: NumberFormatException) {
                false
            }
        }.map(String::toInt)

        //10文字以上の文字列を出力する
        val longTextObserver = publisher.filter {
            it.length >= 10
        }

        longTextObserver.subscribe(this::printText)
        numberObserver.subscribe(this::printNum)

        publisher.onNext("123")

        publisher.onNext("BBB")

        publisher.onNext("BBBBBBBBBBBBBBBBBBBBBBBB")
        publisher.onNext("1111111111")
        publisher.onNext("11111111111111111111111111111111")
    }

    fun printNum(num: Int) {
        println("num:$num")
    }

    fun printText(text: String) {
        println("text:$text")
    }

結果がこれ

output

num:123
text:BBBBBBBBBBBBBBBBBBBBBBBB
text:1111111111
num:1111111111
text:11111111111111111111111111111111

HotObservable#onNext(value)で値を流す。 HotObservable#subscribeした後から流した値が受け取れる。: abc,777は出力されない。 HotObservable#filterやmapなどで別のObservableを生成することが出来る。: numberFilterやlongTextFilterがそれ HotObservable#filterで生成したObservableをSubscribeすれば特定のフィルタリングした値だけを受け取れる。 ちなみにちゃんと購読解除処理書かないと参照持ち続けるので注意しよう。

ということはjsonを受け取って、様々な型に変換し特定の型だけ流すObservableも生成できるということか! この辺は本で読んだけだったので理解が深まった。 触らないとダメやね。