Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

とは言ったものの

Slide 5

Slide 5 text

RxJavaってなんだ…

Slide 6

Slide 6 text

ググってみた

Slide 7

Slide 7 text

結果

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

これは…

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

というわけで

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

RxJavaとは(雑) ● リアクティブプログラミングを行うためのライブラリである 「Reactive Extensions」のJVM版 ● StreamAPI+非同期コールバックみたいなイメージ ● イベントを持ったObservableインスタンスに小さな関数をチェーン してゆく事でイベントから返ってくるデータをストリーム的に加工 する処理を定義し、遅延実行・非同期コールバックを行える ● Java6以上をサポートしていてScala,Groovy,ClojureなどのJVM言語 やAndroidでも使える

Slide 15

Slide 15 text

基本的な使い方 1.Observableを生成する 2.Observerを生成する 3.ObservableにObserver渡して実行する

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

Observer myObserver = new Observer() { @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出力させています。

Slide 18

Slide 18 text

myObservable.subscribe(myObserver); 3.ObservableにObserverを渡して実行する 最後にObservableのsubscribeメソッドにObserverを渡して イベントを実行します。 この時点で初めてObservableが実行され、 onNextに渡した結果が順番にObserverに伝わります。 そして >”Hello” >”world!” と出力されます。

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

Observable.from(new String[]{"Hello", "world!"}).subscribe(System.out::println); ここまでJava8なら1行

Slide 21

Slide 21 text

Observableを加工する ● map ● flatMap ● filter

Slide 22

Slide 22 text

Observableを加工する ● map ● flatMap ● filter

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

Observable.from(new String[]{"Hello", "world!"}) .map(String::length) .subscribe(System.out::println); map 文字列の代わりにInteger型の結果が渡され >5 >6 が順番に出力されます。 実際のコード例です。 subscribeの前にmapを挟み文字列を文字列長の数値に変換しています。

Slide 25

Slide 25 text

Observableを加工する ● map ● flatMap ● filter

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

Observable.from(new String[]{"Hello", "world!"}) .flatMap(s -> Observable.from(s.split(""))) .subscribe(System.out::println); flatMap Helloworld!が一文字ずつ出力されます。 実際のコード例です。 各要素の文字列を一文字ずつに分割したObservableを作り フラット化しています。

Slide 28

Slide 28 text

Observableを加工する ● Map ● flatMap ● filter

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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”以外が一文字ずつ出力されます。

Slide 31

Slide 31 text

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。 簡単に非同期処理へ切り替えられます。

Slide 32

Slide 32 text

And more... RxJavaのGitHubWikiページを見れば他にも大量にある便利メソッドと その詳しい説明が載っています。 https://github.com/ReactiveX/RxJava/wiki

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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