分かった気になるはじめてのRxJava

D96c7e61d2f394f1d0af66945181a230?s=47 きりみん
October 28, 2014

 分かった気になるはじめてのRxJava

D96c7e61d2f394f1d0af66945181a230?s=128

きりみん

October 28, 2014
Tweet

Transcript

  1. 分かった気になる はじめてのRxJava @kirimin

  2. 自己紹介 @kirimin • ふつーのAndroidエンジニア • 仕事ではほぼJavaしか書いたことない • りあくてぃぶ?ナニソレ…というレベル • 人生初LT

  3. 1ヶ月くらい前のある日… 某氏「勉強会でLTしてみません?」 僕 「なにそれこわい」 某氏「こわくない」 僕 「ヨ、ヨッシャ!やります!」

  4. とは言ったものの

  5. RxJavaってなんだ…

  6. ググってみた

  7. 結果

  8. _人人人人人人人人人_ > よく分からない <  ̄Y^Y^Y^Y^Y^Y^Y^Y ̄

  9. RxJava??? • 日本語の情報があんまり見つからない • 色々分かってる前提の情報が多くてそもそも概要が 掴めない • なんかとにかく敷居が高そう

  10. これは…

  11. 他の人もそう思ってるはず!

  12. というわけで

  13. 分かった気になる はじめてのRxJava (※調べてみた)

  14. RxJavaとは(雑) • リアクティブプログラミングを行うためのライブラリである 「Reactive Extensions」のJVM版 • StreamAPI+非同期コールバックみたいなイメージ • イベントを持ったObservableインスタンスに小さな関数をチェーン してゆく事でイベントから返ってくるデータをストリーム的に加工

    する処理を定義し、遅延実行・非同期コールバックを行える • Java6以上をサポートしていてScala,Groovy,ClojureなどのJVM言語 やAndroidでも使える
  15. 基本的な使い方 1.Observableを生成する 2.Observerを生成する 3.ObservableにObserver渡して実行する

  16. Observable<String> myObservable = Observable.create( new Observable.OnSubscribe<String>() { @Override public void

    call(Subscriber<? super String> subscriber) { subscriber.onNext("Hello"); subscriber.onNext("world!"); subscriber.onCompleted(); } } ); 1.Observableを生成する Observableはイベントを定義したインスタンスとして存在し、 イベントの結果を伝える役目を持ちます。 この例ではHelloとWorldの2つの文字列を結果として伝えるイベント を定義しています。
  17. Observer<String> myObserver = new Observer<String>() { @Override public void onNext(String

    s) { System.out.println(s); } @Override public void onCompleted() {} @Override public void onError(Throwable e) {} }; 2.Observerを生成する ObserverはObservableからの結果を受ける側です。 この例では結果をそのままprint出力させています。
  18. myObservable.subscribe(myObserver); 3.ObservableにObserverを渡して実行する 最後にObservableのsubscribeメソッドにObserverを渡して イベントを実行します。 この時点で初めてObservableが実行され、 onNextに渡した結果が順番にObserverに伝わります。 そして >”Hello” >”world!” と出力されます。

  19. Observable<String> myObservable = Observable.from(new String[]{"Hello", "world!"}); myObservable.subscribe(new Action1<String>() { @Override

    public void call(String s) { System.out.println(s); } }); もっと簡潔に書く fromは受け取った配列やIteratorの要素を順番に結果として伝える Observableを生成してくれます。 また、subscribeにはObserverの代わりに関数(Action1インターフェイスの 実装)を一つだけ渡す事で、onNext時に関数を実行してくれます。
  20. Observable.from(new String[]{"Hello", "world!"}).subscribe(System.out::println); ここまでJava8なら1行

  21. Observableを加工する • map • flatMap • filter

  22. Observableを加工する • map • flatMap • filter

  23. map Observableの要素それぞれに対し関数を適用する事で 別のObservableに変換します。

  24. Observable.from(new String[]{"Hello", "world!"}) .map(String::length) .subscribe(System.out::println); map 文字列の代わりにInteger型の結果が渡され >5 >6 が順番に出力されます。

    実際のコード例です。 subscribeの前にmapを挟み文字列を文字列長の数値に変換しています。
  25. Observableを加工する • map • flatMap • filter

  26. flatMap Observableの各要素から別のObservableを作り 一つのObservableに変換します。

  27. Observable.from(new String[]{"Hello", "world!"}) .flatMap(s -> Observable.from(s.split(""))) .subscribe(System.out::println); flatMap Helloworld!が一文字ずつ出力されます。 実際のコード例です。

    各要素の文字列を一文字ずつに分割したObservableを作り フラット化しています。
  28. Observableを加工する • Map • flatMap • filter

  29. filter Observableの要素から条件に合うものだけを抽出します。

  30. Observable.from(new String[]{"Hello", "world!"}) .flatMap(s -> Observable.from(s.split(""))) .filter(s -> !s.equals("l")) .subscribe(System.out::println);

    filter 実際のコード例です。 先程の例にfilterを挟み要素から”l”を取り除いています。 "l”以外が一文字ずつ出力されます。
  31. Observable.from(new String[]{"Hello", "world!"}) .subscribeOn(Schedulers.newThread()) .flatMap(s -> Observable.from(s.split(""))) .filter(s -> !s.equals("l"))

    .subscribe(System.out::println); 別スレッドで実行する 処理を別スレッドで実行したければsubscribeOnを呼ぶだけでOK。 簡単に非同期処理へ切り替えられます。
  32. And more... RxJavaのGitHubWikiページを見れば他にも大量にある便利メソッドと その詳しい説明が載っています。 https://github.com/ReactiveX/RxJava/wiki

  33. まとめ • 非常に多機能で奥は深そう • しかし使い始める敷居は意外と高くないのでは • ただしラムダが無いとかなり辛いコードに… (Java8未満で使うならGroovy,Retrolambda等が必須?)

  34. なんとなく 分かった気になれましたか?

  35. ご清聴ありがとうございました!