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も生成できるということか! この辺は本で読んだけだったので理解が深まった。 触らないとダメやね。