いつか使ってみたいOperatorたち

 いつか使ってみたいOperatorたち

https://connpass.com/event/57150/
Rx Ja Night Vol.2での発表資料です。

11f1c6f9a26793f33d93eed3a97f4a6c?s=128

kazy1991

June 12, 2017
Tweet

Transcript

  1. いつか使ってみたいOperatorたち Cookpad Inc. kazy1991(@101kaz)

  2. マイナーなOperatorの紹介です • アルファベット順のOperatorのリストを読んで 知らなかったものをピックアップしました • 頭の片隅に記憶しておいていつか使ってみたい


  3. Amb • 複数のObservableを引数に取る
 • 一番先にitemが流れたObservableを採用する
 • その他のObservableのitemは流れてこない 1/8

  4. Amb       Amb  

        1/8
  5. Ambのサンプルコード fun ampSample() { val o1 = Observable.just(1, 2, 3)

    val o2 = Observable.just(4, 5, 6).delay(1L, TimeUnit.SECONDS) val o3 = Observable.just(7, 8, 9).delay(2L, TimeUnit.SECONDS) Observable.amb(o1, o2, o3) .subscribe { Log.d(TAG, "item: $it") // "item: 1, item: 2, item: 3" } } RxJava 1系 RxJava 2系 fun ampSample() { val o1 = Observable.just(1, 2, 3) val o2 = Observable.just(4, 5, 6).delay(1L, TimeUnit.SECONDS) val o3 = Observable.just(7, 8, 9).delay(2L, TimeUnit.SECONDS) Observable.ambArray(o1, o2, o3) .subscribe { Log.d(TAG, "item: $it") // "item: 1, item: 2, item: 3" } } 1/8
  6. Ambの使いみち • 複数のAPIサーバーに同時にアクセス..?
 • UIイベントを並べて競わせる..?
 • 自分は具体的な利用例が考えられなかった..! 1/8

  7. All • 引数にFunc1の条件を渡す • 全てのitemが条件を満たせばtrueを返す
 • 一つでも条件を満たさない場合faseを返す 2/8

  8. All   All(x => x < 10) 5 

      2/8
  9. Allのサンプルコード fun allSample() { Observable.just(1, 2, 3, 4, 5) .all

    { it < 10 } .subscribe { Log.d(TAG, "item: $it") // item: true } } RxJava 1系 2/8
  10. Allの使いみち • 真偽値に変換されるので、Validation系かな?
 • こちらも良い例が思いつかなかった..! 2/8

  11. Cache • #cacheを呼ぶとCacheObservableに変換される
 • 一度購読されると内容は記憶する
 • 二度目以降に購読された場合は記憶した内容を返す 3/8

  12. Cache   Cache      

           3/8
  13. Cacheのサンプルコード fun cacheSample() { val o1 = Observable.interval(1, TimeUnit.SECONDS) .take(3)

    .timestamp() .cache() o1 .doAfterTerminate { // Ұ౓໨ͱಉ͡item͕ྲྀΕͯ͘Δ o1.subscribe { Log.d(TAG, "2nd: item: ${it.timestampMillis}") } } .subscribe { Log.d(TAG, "1st: item: ${it.timestampMillis}") } } RxJava 1系 3/8
  14. Cacheの使いみち • APIレスポンスを保持するとか..?
 • 計算量のかかる結果を保存するとか..?
 • 似たOperatorでreplayもあるけど使い分けはどう なるんだろう..? RxJava- Is

    cache() the same as replay()? stackoverflow.com/questions/32522017/rxjava-is-cache-the-same-as-replay 3/8
  15. Cast • 本当にitemをcastするだけのOperator
 • map(it -> T(it)) のような感じ
 • マーブルやサンプルコードは省略します

    4/8
  16. ElementAt(OrDefault) • 引数に渡したIndexのitemを返す
 • List#getみたいなOperator
 • orDefaultも用意されているので安全
 • これもマーブルやサンプルコードは省略します 5/8

  17. ToMap/ToMultiMap • itemをMapに変換する
 • 引数にFunc1を受取り、その中でキー名を決める 6/8

  18. ToMap/ToMultiMap   ToMap(k())    { } &OUSZ

    &OUSZ &OUSZ &OUSZ &OUSZ 6/8
  19. toMapのサンプルコード fun toMapSample() { Observable.just(1, 2, 3) .toMap { "key_$it"

    } .flatMap { Observable.from(it.entries) } .subscribe { (key, value) -> // "{key_1: 1, key_2: 2, key_3: 3}" Log.d(TAG, "key: $key value: $value") } } RxJava 1系 6/8
  20. toMultiMapのサンプルコード fun toMultiMapSample() { Observable.just(1, 2, 3, 4, 5, 6)

    .toMultimap { if (it % 2 == 0) { "even" } else { "odd" } } .flatMap { Observable.from(it.entries) } .subscribe { (key, value) -> // "{even: [2, 4, 6], odd: [1, 3, 5]}" Log.d(TAG, "key: $key value: $value") } } RxJava 1系 6/8
  21. ToMap/ToMultiMapの使いみち • アプリケーションロジックで活用できそうな気が する
 • 今までReduceで頑張って書いてたので書き直した いと思ってる 6/8

  22. Timestamp • 流れてきたitemをTimestampedでwrapする
 • valueとtimeStampを持つdata-objectを返す
 • timeStampは内部でScheduler.now()が生成する 7/8

  23. Timestamp   timeStamp 5JNF    5JNF 5JNF

    5JNF 5JNF 7/8
  24. Timestampのサンプルコード fun timeStampSample() { Observable.interval(1, TimeUnit.SECONDS) .take(3) .timestamp() .subscribe {

    Log.d(TAG, "item: $it") //item: Timestamped(timestampMillis = 1497221576918, value = 0) } } RxJava 1系 7/8
  25. Timestampの使いみち • 処理が行われた時間が把握できるのでパフォーマン ス・チューニングとか..?
 • これも良いユースケースが見つからなかった 7/8

  26. Sorted/ToSortedList • 流れてきたitemをソートして返す
 • Func1を渡すことが出来ソート条件も指定可能
 • 内部ではCollections.sortを利用している 8/8

  27. Sorted/ToSortedList   Sort      

      8/8
  28. Sorted/ToSortedList [ ]   ToSortList    

        8/8
  29. Sorted/toSortedListのサンプルコード fun sortedSample() { Observable.just(3, 2, 1, 5, 4) .sorted

    { t1, t2 -> t2 - t1 } .subscribe { Log.d(TAG, "item: $it") } } fun toSortedListSample() { Observable.range(1, 100) .toSortedList({ t1, t2 -> t2 - t1 }, 100) .subscribe { Log.d(TAG, "item: $it") } } RxJava 1系 8/8
  30. Sortedの使いみち • 今まで、doOnNext(it -> Collections.sort(it)) 
 の様に書いていたので早速活用していきたい
 • 今すぐ使えそうなOperatorが一つでも見つかってよ かった!

    8/8
  31. 今日紹介したOperatorたち • Amp • All • Cast • ElementAt •

    Cache • Join • ToMap/ToMultiJoin • Timestamp • Sorted/SortedList Join/GroupJoinも気になってたけど時間が足りなかった。。
  32. 以上です。ありがとうございました!! Cookpad Inc. kazy1991(@101kaz)