Suche senden
Hochladen
Rxjavaとoptionalで関数型androidしよう
•
16 gefällt mir
•
4,722 views
Fumihiko Shiroyama
Folgen
Rxjavaとoptionalで関数型androidしよう @Shibuya.apk #2
Weniger lesen
Mehr lesen
Software
Melden
Teilen
Melden
Teilen
1 von 54
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Asami Abe
Dark vol4 for_slideshare
Dark vol4 for_slideshare
ara_ta3
Java使いにとっての関数
Java使いにとっての関数
amkt922
Scalaはじめました!
Scalaはじめました!
Asami Abe
MacroPyがすごい
MacroPyがすごい
Takashi Kawachi
Scala.js触ってみた
Scala.js触ってみた
Asami Abe
こわくないScala
こわくないScala
FScoward
とりあえず使えるSBT
とりあえず使えるSBT
Kiyotaka Kunihira
Empfohlen
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Scala再入門 @2014/02/08 Scala関西ビギナーズ第3回
Asami Abe
Dark vol4 for_slideshare
Dark vol4 for_slideshare
ara_ta3
Java使いにとっての関数
Java使いにとっての関数
amkt922
Scalaはじめました!
Scalaはじめました!
Asami Abe
MacroPyがすごい
MacroPyがすごい
Takashi Kawachi
Scala.js触ってみた
Scala.js触ってみた
Asami Abe
こわくないScala
こわくないScala
FScoward
とりあえず使えるSBT
とりあえず使えるSBT
Kiyotaka Kunihira
Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門
yujiro_t
おっさんES6/ES2015,React.jsを学ぶ
おっさんES6/ES2015,React.jsを学ぶ
dcubeio
関数型もモナドも分からなくてもScalaと言う言語は便利らしい
関数型もモナドも分からなくてもScalaと言う言語は便利らしい
ke-m kamekoopa
ScalaでBacklogの通知bot作ったで
ScalaでBacklogの通知bot作ったで
Asami Abe
Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]
Ra Zon
元インフラエンジニアが Scalaを触ってつまづいたところ。
元インフラエンジニアが Scalaを触ってつまづいたところ。
takako onoue
PlayFramework1.x基礎編
PlayFramework1.x基礎編
Asami Abe
ぼくのかんがえたさいきょうの Rails スタートダッシュ
ぼくのかんがえたさいきょうの Rails スタートダッシュ
Kenji Mori
Railsバージョンアップを段階的に行うためにRails3/4並行稼動させる仕組みを作ってる話
Railsバージョンアップを段階的に行うためにRails3/4並行稼動させる仕組みを作ってる話
Masayuki Morita
Ruby on Rails 入門
Ruby on Rails 入門
Yasuko Ohba
あなたが知らない リレーショナルモデル
あなたが知らない リレーショナルモデル
Mikiya Okuno
Java8 code kata (Japanese)
Java8 code kata (Japanese)
Hiroaki Kono
20150207 何故scalaを選んだのか
20150207 何故scalaを選んだのか
Katsunori Kanda
JavaScriptで出来る、あんなことこんなこと
JavaScriptで出来る、あんなことこんなこと
Mayu Kimura
クライアントサイドjavascript簡単紹介
クライアントサイドjavascript簡単紹介
しくみ製作所
Scalaz-StreamによるFunctional Reactive Programming
Scalaz-StreamによるFunctional Reactive Programming
Tomoharu ASAMI
Introduction of SQL Anti-pattern at Phpcon Hokkaido
Introduction of SQL Anti-pattern at Phpcon Hokkaido
Kenta Kawai
TypeScript超入門
TypeScript超入門
Narami Kiyokura
こわくないScala
こわくないScala
Kota Mizushima
Scala is-unscared
Scala is-unscared
Kota Mizushima
Reactive Systems と Back Pressure
Reactive Systems と Back Pressure
Akihiro Ikezoe
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
Ra Zon
Weitere ähnliche Inhalte
Was ist angesagt?
Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門
yujiro_t
おっさんES6/ES2015,React.jsを学ぶ
おっさんES6/ES2015,React.jsを学ぶ
dcubeio
関数型もモナドも分からなくてもScalaと言う言語は便利らしい
関数型もモナドも分からなくてもScalaと言う言語は便利らしい
ke-m kamekoopa
ScalaでBacklogの通知bot作ったで
ScalaでBacklogの通知bot作ったで
Asami Abe
Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]
Ra Zon
元インフラエンジニアが Scalaを触ってつまづいたところ。
元インフラエンジニアが Scalaを触ってつまづいたところ。
takako onoue
PlayFramework1.x基礎編
PlayFramework1.x基礎編
Asami Abe
ぼくのかんがえたさいきょうの Rails スタートダッシュ
ぼくのかんがえたさいきょうの Rails スタートダッシュ
Kenji Mori
Railsバージョンアップを段階的に行うためにRails3/4並行稼動させる仕組みを作ってる話
Railsバージョンアップを段階的に行うためにRails3/4並行稼動させる仕組みを作ってる話
Masayuki Morita
Ruby on Rails 入門
Ruby on Rails 入門
Yasuko Ohba
あなたが知らない リレーショナルモデル
あなたが知らない リレーショナルモデル
Mikiya Okuno
Java8 code kata (Japanese)
Java8 code kata (Japanese)
Hiroaki Kono
20150207 何故scalaを選んだのか
20150207 何故scalaを選んだのか
Katsunori Kanda
JavaScriptで出来る、あんなことこんなこと
JavaScriptで出来る、あんなことこんなこと
Mayu Kimura
クライアントサイドjavascript簡単紹介
クライアントサイドjavascript簡単紹介
しくみ製作所
Scalaz-StreamによるFunctional Reactive Programming
Scalaz-StreamによるFunctional Reactive Programming
Tomoharu ASAMI
Introduction of SQL Anti-pattern at Phpcon Hokkaido
Introduction of SQL Anti-pattern at Phpcon Hokkaido
Kenta Kawai
TypeScript超入門
TypeScript超入門
Narami Kiyokura
こわくないScala
こわくないScala
Kota Mizushima
Scala is-unscared
Scala is-unscared
Kota Mizushima
Was ist angesagt?
(20)
Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門
おっさんES6/ES2015,React.jsを学ぶ
おっさんES6/ES2015,React.jsを学ぶ
関数型もモナドも分からなくてもScalaと言う言語は便利らしい
関数型もモナドも分からなくてもScalaと言う言語は便利らしい
ScalaでBacklogの通知bot作ったで
ScalaでBacklogの通知bot作ったで
Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]
元インフラエンジニアが Scalaを触ってつまづいたところ。
元インフラエンジニアが Scalaを触ってつまづいたところ。
PlayFramework1.x基礎編
PlayFramework1.x基礎編
ぼくのかんがえたさいきょうの Rails スタートダッシュ
ぼくのかんがえたさいきょうの Rails スタートダッシュ
Railsバージョンアップを段階的に行うためにRails3/4並行稼動させる仕組みを作ってる話
Railsバージョンアップを段階的に行うためにRails3/4並行稼動させる仕組みを作ってる話
Ruby on Rails 入門
Ruby on Rails 入門
あなたが知らない リレーショナルモデル
あなたが知らない リレーショナルモデル
Java8 code kata (Japanese)
Java8 code kata (Japanese)
20150207 何故scalaを選んだのか
20150207 何故scalaを選んだのか
JavaScriptで出来る、あんなことこんなこと
JavaScriptで出来る、あんなことこんなこと
クライアントサイドjavascript簡単紹介
クライアントサイドjavascript簡単紹介
Scalaz-StreamによるFunctional Reactive Programming
Scalaz-StreamによるFunctional Reactive Programming
Introduction of SQL Anti-pattern at Phpcon Hokkaido
Introduction of SQL Anti-pattern at Phpcon Hokkaido
TypeScript超入門
TypeScript超入門
こわくないScala
こわくないScala
Scala is-unscared
Scala is-unscared
Ähnlich wie Rxjavaとoptionalで関数型androidしよう
Reactive Systems と Back Pressure
Reactive Systems と Back Pressure
Akihiro Ikezoe
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
Ra Zon
サーバサイドエンジニアが 1年間まじめにSPAやってみた
サーバサイドエンジニアが 1年間まじめにSPAやってみた
Itaru Kitagawa
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
Ra Zon
Reactive Extensionの紹介
Reactive Extensionの紹介
Dev Ogiwara
Object-Funcational Analysis and design
Object-Funcational Analysis and design
Tomoharu ASAMI
Redux, Relay, HorizonあるいはElm
Redux, Relay, HorizonあるいはElm
chuck h
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
Yuta Okamoto
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
Developers Summit
The Essence of Using Ruby on Rails in Corporations
The Essence of Using Ruby on Rails in Corporations
Koichiro Ohba
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
Nobukazu Hanada
Ruby Extended Library
Ruby Extended Library
Akio Tajima
デザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリング
kei takakuda
Scala.jsはじめました!
Scala.jsはじめました!
K Kinzal
JavascriptでRubyの作り方
JavascriptでRubyの作り方
Shuyo Nakatani
rChartsによるインタラクティブな可視化表現
rChartsによるインタラクティブな可視化表現
Yasuyuki Sugai
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Tomoharu ASAMI
ATN No.2 Scala事始め
ATN No.2 Scala事始め
AdvancedTechNight
JavaScriptことはじめ
JavaScriptことはじめ
Yuki Ishikawa
Rx Showcase
Rx Showcase
Takaaki Suzuki
Ähnlich wie Rxjavaとoptionalで関数型androidしよう
(20)
Reactive Systems と Back Pressure
Reactive Systems と Back Pressure
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
サーバサイドエンジニアが 1年間まじめにSPAやってみた
サーバサイドエンジニアが 1年間まじめにSPAやってみた
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
Reactive Extensionの紹介
Reactive Extensionの紹介
Object-Funcational Analysis and design
Object-Funcational Analysis and design
Redux, Relay, HorizonあるいはElm
Redux, Relay, HorizonあるいはElm
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
【デブサミ福岡B5】コードレビューの進め方~全員で行う品質の維持~
The Essence of Using Ruby on Rails in Corporations
The Essence of Using Ruby on Rails in Corporations
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
Ruby Extended Library
Ruby Extended Library
デザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリング
Scala.jsはじめました!
Scala.jsはじめました!
JavascriptでRubyの作り方
JavascriptでRubyの作り方
rChartsによるインタラクティブな可視化表現
rChartsによるインタラクティブな可視化表現
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
ATN No.2 Scala事始め
ATN No.2 Scala事始め
JavaScriptことはじめ
JavaScriptことはじめ
Rx Showcase
Rx Showcase
Mehr von Fumihiko Shiroyama
Firebase with Android
Firebase with Android
Fumihiko Shiroyama
RxJava - Subject 入門
RxJava - Subject 入門
Fumihiko Shiroyama
GCP HTTPロードバランサ運用例
GCP HTTPロードバランサ運用例
Fumihiko Shiroyama
GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発
Fumihiko Shiroyama
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Fumihiko Shiroyama
AndroidでEither
AndroidでEither
Fumihiko Shiroyama
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方
Fumihiko Shiroyama
Ops worksに今後期待するところ
Ops worksに今後期待するところ
Fumihiko Shiroyama
Wallet api
Wallet api
Fumihiko Shiroyama
Google io 2013_keynote
Google io 2013_keynote
Fumihiko Shiroyama
Mehr von Fumihiko Shiroyama
(10)
Firebase with Android
Firebase with Android
RxJava - Subject 入門
RxJava - Subject 入門
GCP HTTPロードバランサ運用例
GCP HTTPロードバランサ運用例
GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
AndroidでEither
AndroidでEither
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方
Ops worksに今後期待するところ
Ops worksに今後期待するところ
Wallet api
Wallet api
Google io 2013_keynote
Google io 2013_keynote
Rxjavaとoptionalで関数型androidしよう
1.
RxJavaとOptionalで 関数型Androidしよう shibuya.apk #2 2015-07-30
2.
• 白山 文彦(しろやま ふみひこ) • 株式会社マナボ 技術者 •
@fushiroyama / fu.shiroyama@gmail.com • ナマポではありません。これだけ覚えて帰ってく ださい。 • すごいHaskellたのしく学ぼう読書会やってま す!求む同士!気軽に話しかけて下さい!
3.
お詫び • 「関数型」とタイトルに入れましたが誤解を招 きやすいので資料の最後で発表者の考える関数 型プログラミングについて補足してあります。
4.
Optional
5.
• Haskell • Maybe
a = Nothing ¦ Just a • Scala • Option[T] = Some(T) ¦ None
6.
• あるかもしれないし、ないかもしれない • ないかもしれない可能性を型で明示 •
ないかもしれないまま扱える
7.
• Map#get…キーがなければnull • String#indexOf…見つからなければ-1 •
特定条件下で返り値がない、いつもと違うケー スではOptionalを使うチャンス!
8.
Android doesn t suport
Java 8
9.
• RxJavaのObservable<T>でOptional<T>を代行 する (by
id:sys1yagi) • http://sys1yagi.hatenablog.com/entry/ 2015/01/26/183000 • 神いわゆるゴッド • RxJava(後述)でOptionalを代用
10.
• eccyan/RxJava-Optional • https://github.com/eccyan/RxJava-Optional •
素晴らしすぎます。ありがとうございます。
11.
repositories { jcenter() } dependencies { compile
'io.reactivex:rxandroid:0.25.0' compile 'com.eccyan:rxjava-optional:1.1.2' } バージョン注意
12.
早速使おう!
13.
Optional作る • Optional.of(T) • Optional.ofNullable(T) •
Optional.empty()
14.
• Optional.of(null) • NullPointerException •
Optional.ofNullable(null) • OK! • Optional.empty = Optional.ofNullable(null)
15.
• その式でNonNullであることが自明である場合 はOptional.of()を使う • Optional.ofNullable()を毎回使うみたいな考え 方は誤り!
16.
Optional使う • Optional#get() • Optional#orElse(T) •
Optional#orElseCall(() -> {T}) • Optional#orElseThrow(() -> {Throwable})
17.
• Optional#get • 見つからなければNoSuchElementException •
Optional#orElse(elseValue) • Optional#orElseCall(() -> elseValue) • ラムダ式の結果がelseValueに • Optional#orElseThrow(() -> Throwable)
18.
• Optional#get は中身があるかどうか意識する必 要があるのであまり使わない •
if (opt.isPresent) { opt.get() } とかは最悪 • orElseとorElseCallの違いは、後者はemptyの 場合に初めてラムダ式の中身が評価される • orElseThrowの多用は禁物。これするぐらいな らなぜ普通にthrowしないのか考えよう。
19.
Maybeモナド的に使う • Optional#ifPresent(val ->
{}) • Optional#map(T -> U) • Optional#flatMap(T -> Optional<U>) • Optional#filter(Predicator<T, Boolean> -> T)
20.
Optional#ifPresent Optional<String> opt =
Optional.of(getOpt()); opt.ifPresent(s -> Log.i(TAG, s)); nullのときは何もしない
21.
Optional#map Optional<String> nameOpt = entityOpt.map(userEntity
-> userEntity.getFirstName()); entityOpt.map(UserEntity::getFirstName); と表記可(メソッド参照)
22.
Optional#flatMap Optional<Optional<T>>を flatten(平らにする)イメージ Optional<AnotherOptional> anotherOpt = entityOpt.flatMap(userEntity
-> { return userEntity.getAnotherOptional(); });
23.
Optional#filter a -> Bool
-> a String userName = entityOpt .filter(entity -> entity.getUserName.contains( hoge ));
24.
String userName =
entityOpt .filter(entity -> !TextUtils.isEmpty(entity.getUserName())) .map(UserEntity::getUserName) .orElse(getString(R.string.default_name)); filterやorElseとかと組み合わせると 更に強力に!
25.
Optional総括 • ほぼ完全なOptionalがAndroidでも使える • 幾つかメソッド名が違ったり、SupplierやFunctionなどの関数オブジェクト型がRxJavaの Action1やFunction1で置き換えられているがラムダ式を使う限り何も意識する必要がない •
外出しの変数とnullチェックやforループみたいな手続き的 な処理をかなり減らせる • パターンマッチもタプルもないが充分強力 • 正しく使う限りデメリットが思いつかないので積極的にプ ロジェクトに取り入れるべきだと思う ラムダ式は後述
26.
RxJava
27.
RxJava • https://github.com/ReactiveX/RxJava • オブザーバパターンを拡張してデータやイベントの シーケンス(一連の流れ)をサポートし、これらの シーケンスを宣言的に組み合わせるオペレータを提 供する。 •
RxAndroidという、Androidで使って便利なRxJava 拡張(というのが適切かわからないですが)も存在 する
28.
インストール • compile io.reactivex:rxandroid:0.25.0' •
RxAndroidを入れるとRxJavaも一緒に入る • RxAndroidは現時点で大きくなりすぎて開発者の間でライ ブラリの分割が検討されており、RxAndroid固有の機能を 利用する場合は注意を要する • https://github.com/ReactiveX/RxAndroid/issues/172 • https://github.com/JakeWharton/RxBinding
29.
• プロミスとしての使われ方が一番一般的 • 将来起こる一連のイベントの流れを表現する •
非同期通信の結果 • ユーザのタッチイベント • リスト • 参考)RxJava学習のベストプラクティスっぽいもの by yagi • https://speakerdeck.com/sys1yagi/rxjavaxue-xi-falsehesutohurakuteisutuhoimofalse
30.
Observable • オブザーバパターンの観測対象に相当 • イベントドリブンに結果が通知されてくる •
観測者(わたくしども)はObservableをsubscribe(購読)し、 結果を好きなようにし、不要なタイミングでunsubscribe(購読 解除)する • プロミスと違い、いつ終わるとも知れない無限ストリームも表現 できる(例:ユーザのタッチイベントはいつ来るとも知れず、ユー ザが飽きてスマホを放り投げるまで永久に続くかもしれない)
31.
結果を受け取る • onNext(result ->
{}) • 例えばユーザタッチイベントのObservableはユーザがタッチするごとにonNextにコールバックされる • 非同期通信のObservableはここで結果を受け取る • onError(e) • エラーが発生するとここで受け取る • onComplete() • 有限ストリームは最後にここが呼ばれる
32.
Retrofitで試す • compile com.squareup.retrofit:retrofit:1.9.0' •
@GET("/user/{id}/photo") void getUserPhoto(@Path("id") int id, Callback<Photo> cb); • @GET("/user/{id}/photo") Observable<Photo> getUserPhoto(@Path("id") int id);
33.
RestAdapter restAdapter =
new RestAdapter.Builder() .setEndpoint("https://api.github.com") .build(); GitHubService service = restAdapter.create(GitHubService.class); service.getUserPhoto(12345) .subscribe( photo -> { doSomething(photo); } error -> {}, () -> {} // complete ); 購読! 非同期処理はこの瞬間はじまる。
34.
で、何が嬉しいの?
35.
Observableは連結できる!
36.
各種オペレータは後述 こんなことが簡単に! Observable<Token> tokenObservable =
getTokenObservable(); tokenObservable .flatMap(token -> getUserInfoObservable(token, args)) .subscribe( userInfo -> { doSomething(userInfo) }, error -> {}, );
37.
重要ポイントおさらい • Observableはいくつでも連結できるよ(複数の Observableの連結方法はこのあと出てくる) • 複数のObservableがそれぞれ非同期処理をするとして、 それぞれをシーケンシャルに実行して結果を次々渡す などもお手の物。(もちろんパラレルにも出来る) •
Observable自体は将来実行される何かなので、そのオ ブジェクト自体ができた時点では何も起こってないこ とに注意。
38.
実行場所と観測場所 • Observable#subscribeOn • Observableがsubscribeされるスレッドを指定(処理が実行されるスレッドと考えて差し支えない) •
Observableごとに異なるsubscribeOnを指定みたいなことは出来ない。いくつ指定しても最初に指 定したものが使わる。 • Observable#observeOn • Observableがイベントを通知する先のスレッドを変更 • Androidの場合だと非同期処理の結果をViewに描画するときはMainThreadである必要があるので、 subscribeの直前でobserveOnにRxAndroidのAndroidSchedulers.mainThread()を指定すると便 利
39.
GitHubService service =
restAdapter.create(GitHubService.class); service.getUserPhoto(12345) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( photo -> { doSomething(photo); } error -> {}, () -> {} // complete ); ワーカスレッドで実行 メインスレッドに結果を 通知してもらう
40.
各種オペレータ • map • Observable<T>
-> U • flatMap • Observable<T> -> Observable<U> • filter • retry • take • などなど…便利なのが山ほどある
41.
Observableを連結する • Observable.merge • Observable.concat •
Observable.zip • Observable.combineLatest
42.
Observable.merge • 複数のObservableを1つにまとめる • 各々のObservableから排出されるアイテムTは 排出された時系列に並べれる(パラレル)
43.
44.
Observable.concat • 複数のObservableを1つにまとめる • 各々のObservableから排出されるアイテムTは 前のObservableから排出された順、次の Observableから排出された順というふうに並べ れる(シリアル)
45.
46.
Observable.zip • 複数のObservableを1つにまとめる • 各々のObservableから排出されるアイテムTは ひとつめのObservableから排出された最新のも のと、もうひとつのObservableから排出された 最新のものをペアにして関数に渡される
47.
48.
Observable.combineLatest • 複数のObservableを1つにまとめる • 複数のObservableの、それぞれ最後のアイテムにfuncを適用して新し い結果を次に返す。 •
funcは複数のObservableのどれかのonNextが来るたびに適用され る。 • zipと似ているが、複数のObservableのそれぞれ最新の値を待ち合わせ るわけではない。どれかがonNextに来るたびに呼ばれて、値が新しく なったもの以外はこれまでの最新の値がfuncの引数に渡る。このこと によって、3つぐらいの条件が全て満たされたら○○みたいなのが非常 に書きやすくなる。これめっちゃつかえるので絶対に覚える必要あり。
49.
50.
WidgetもObservableに Observable.combineLatest( WidgetObservable.text(editTextNickname), WidgetObservable.text(editTextPhone), (onTextChangeEvent, onTextChangeEvent2) ->
{ return TextUtils.isEmpty(onTextChangeEvent.text()) && TextUtils.isEmpty(onTextChangeEvent2.text()); }) .subscribe( submitButton::setEnabled);
51.
まとめ • Observable(ストリーム)をリストと考えると、 リストに対して関数をmap(写像)して違う結果を 得るというのは非常に関数型プログラミング的でとっ つきやすい • Observableと前出のOptional(今回は実質同じも の)を組み合わせると非常に表現の幅が広がる •
すべてがObservableな世界ではObservableを組み 合わせるだけでアプリが完成する!
52.
Androidで関数型プログラミング • あるデータ構造(しばしばリスト)aに関数を適用して別のデー タ構造bを得る。(a ->
b) -> [a] -> [b] • Maybe的にデータ構造の中身を取り出すことなく利用する • こういったプログラミングスタイルが可能になることから 「Androidで関数型プログラミング」という表現を使いました • Androidで利用可能なJavaで参照透過性を強制するのは不可能 だし無意味だし高階関数も中途半端なので世間的には関数型プロ グラミングとは見なされないかもしれませんが、どうか広い心で 発表を楽しんでいただけたら幸いです
53.
いい忘れ • ラムダ式はRetrolambdaで使えます • ラムダ式 •
メソッド参照 • ちょっとインストールややこしいので後で加筆 します。
54.
ご静聴ありがとうございました。
Jetzt herunterladen