Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
分かった気になるはじめてのRxJava
Search
きりみん
October 28, 2014
Technology
7.4k
14
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
分かった気になるはじめてのRxJava
きりみん
October 28, 2014
More Decks by きりみん
See All by きりみん
AndroidエンジニアがRailsにチャレンジしてる理由
kirimin
1
1.6k
What are AtCoder and competitive programming
kirimin
0
10k
バーチャル男声幼女プログラマーとして活動した1年間の振り返り
kirimin
0
1.1k
アプリエンジニアでも神絵師になりたい!
kirimin
4
5.5k
Watashi ni Kotlin ga maiorita
kirimin
0
610
NEMのAPIとモザイクであそぼう
kirimin
0
420
はじめようきれいなコード
kirimin
8
3.2k
Material Components for Android触ってみる
kirimin
7
2.1k
[社内LT]あたらしいMaterial Design
kirimin
1
1.8k
Other Decks in Technology
See All in Technology
GitHub Copilot 最新アップデート – 「一歩先」の実践活用術
moulongzhang
5
1.6k
アジャイルな経理と Claude Code と経営の未来
kawaguti
PRO
3
180
秘密度ラベル初心者が第1歩でつまづかないための「設計・運用」ポイント
seafay
PRO
1
420
iOS アプリの「これって不具合ですか?」を AI に調べてもらう
miichan
0
130
【Cyber-sec+】経営層を"動かす"ための考え方
hssh2_bin
0
200
クラウドファンディング版StackChan 3体(4体)をインタラクティブな体験型作品にして展示もした話 / スタックチャンお誕生日会2026
you
PRO
0
140
MUSUBI 田中裕一『AIと共に行う「しごとのリデザイン」- スモールバックオフィス編』AI Ops Lab #4
musubi
0
280
データレイクの「見えない問題」を可視化する
sansantech
PRO
1
170
GitHub Copilot app最速の発信の裏側
tomokusaba
1
230
ぼっちではじめた登壇が「51名」「241件」の発信に化けた
subroh0508
1
290
螺旋型キャリアの生存戦略 / kinoko-conf2026
rakus_dev
1
690
AI時代のコスト管理を考えよう〜明日から使える実践AWSノウハウ~
yoshimi0227
0
750
Featured
See All Featured
Accessibility Awareness
sabderemane
1
140
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
170
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
410
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
200
Thoughts on Productivity
jonyablonski
76
5.2k
Bash Introduction
62gerente
615
220k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
440
Measuring & Analyzing Core Web Vitals
bluesmoon
9
870
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
200
Building Applications with DynamoDB
mza
96
7.1k
Transcript
分かった気になる はじめてのRxJava @kirimin
自己紹介 @kirimin • ふつーのAndroidエンジニア • 仕事ではほぼJavaしか書いたことない • りあくてぃぶ?ナニソレ…というレベル • 人生初LT
1ヶ月くらい前のある日… 某氏「勉強会でLTしてみません?」 僕 「なにそれこわい」 某氏「こわくない」 僕 「ヨ、ヨッシャ!やります!」
とは言ったものの
RxJavaってなんだ…
ググってみた
結果
_人人人人人人人人人_ > よく分からない <  ̄Y^Y^Y^Y^Y^Y^Y^Y ̄
RxJava??? • 日本語の情報があんまり見つからない • 色々分かってる前提の情報が多くてそもそも概要が 掴めない • なんかとにかく敷居が高そう
これは…
他の人もそう思ってるはず!
というわけで
分かった気になる はじめてのRxJava (※調べてみた)
RxJavaとは(雑) • リアクティブプログラミングを行うためのライブラリである 「Reactive Extensions」のJVM版 • StreamAPI+非同期コールバックみたいなイメージ • イベントを持ったObservableインスタンスに小さな関数をチェーン してゆく事でイベントから返ってくるデータをストリーム的に加工
する処理を定義し、遅延実行・非同期コールバックを行える • Java6以上をサポートしていてScala,Groovy,ClojureなどのJVM言語 やAndroidでも使える
基本的な使い方 1.Observableを生成する 2.Observerを生成する 3.ObservableにObserver渡して実行する
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つの文字列を結果として伝えるイベント を定義しています。
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出力させています。
myObservable.subscribe(myObserver); 3.ObservableにObserverを渡して実行する 最後にObservableのsubscribeメソッドにObserverを渡して イベントを実行します。 この時点で初めてObservableが実行され、 onNextに渡した結果が順番にObserverに伝わります。 そして >”Hello” >”world!” と出力されます。
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時に関数を実行してくれます。
Observable.from(new String[]{"Hello", "world!"}).subscribe(System.out::println); ここまでJava8なら1行
Observableを加工する • map • flatMap • filter
Observableを加工する • map • flatMap • filter
map Observableの要素それぞれに対し関数を適用する事で 別のObservableに変換します。
Observable.from(new String[]{"Hello", "world!"}) .map(String::length) .subscribe(System.out::println); map 文字列の代わりにInteger型の結果が渡され >5 >6 が順番に出力されます。
実際のコード例です。 subscribeの前にmapを挟み文字列を文字列長の数値に変換しています。
Observableを加工する • map • flatMap • filter
flatMap Observableの各要素から別のObservableを作り 一つのObservableに変換します。
Observable.from(new String[]{"Hello", "world!"}) .flatMap(s -> Observable.from(s.split(""))) .subscribe(System.out::println); flatMap Helloworld!が一文字ずつ出力されます。 実際のコード例です。
各要素の文字列を一文字ずつに分割したObservableを作り フラット化しています。
Observableを加工する • Map • flatMap • filter
filter Observableの要素から条件に合うものだけを抽出します。
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”以外が一文字ずつ出力されます。
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。 簡単に非同期処理へ切り替えられます。
And more... RxJavaのGitHubWikiページを見れば他にも大量にある便利メソッドと その詳しい説明が載っています。 https://github.com/ReactiveX/RxJava/wiki
まとめ • 非常に多機能で奥は深そう • しかし使い始める敷居は意外と高くないのでは • ただしラムダが無いとかなり辛いコードに… (Java8未満で使うならGroovy,Retrolambda等が必須?)
なんとなく 分かった気になれましたか?
ご清聴ありがとうございました!