Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
いつか使ってみたいOperatorたち
Search
kazy1991
June 12, 2017
Technology
520
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
いつか使ってみたいOperatorたち
https://connpass.com/event/57150/
Rx Ja Night Vol.2での発表資料です。
kazy1991
June 12, 2017
More Decks by kazy1991
See All by kazy1991
基本のAndroid View開発ドキュメント
kazy1991
0
2.9k
Cookpad.apk#1-ReactNativeについて
kazy1991
1
6.7k
Cookpad TechKitchen#6-android-with-ml-and-scheduler
kazy1991
0
750
Droidkaigi 2017
kazy1991
5
13k
RxJava Droidkaigi
kazy1991
1
120
rx.pdf
kazy1991
0
150
はじめてのvimscipt
kazy1991
1
470
Other Decks in Technology
See All in Technology
【技術的負債conf】事業成長に伴う技術的負債の説明責任とAIによるモニタリング、認知的負債について
i35_267
2
1.6k
CLIライブラリ開発を支える技術
htnabe
0
120
その Lambda、8分で 管理者権限まで奪われます
k1nakayama
2
330
ユーザー価値を届け続けるためにウォンテッドリーが大切にしている文化
kotaminato
0
160
Reactの設計論
uhyo
24
13k
AIネイティブプロダクトで顧客価値を最大化するプロダクトエンジニアとFDEの協働
righttouch
PRO
0
310
安心して変更できるWebフロントエンドの作り方
pirosikick
4
2.6k
Omarchy Quattro の日本語設定周り
simosako
2
180
AI時代、データエンジニアが一番おもろい
genshun9
0
610
OpenTelemetryのメトリクスをCloudWatchに送ってPromQLで見てみた
ota1022
0
150
ADKで始める業務改善 - AIエージェント開発時の考えと設計
harappa80
2
120
TinyGo 開発サイクルを高速化する:Go で作るエミュレータ入門
zozotech
PRO
1
740
Featured
See All Featured
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
490
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Thoughts on Productivity
jonyablonski
76
5.4k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Claude Code のすすめ
schroneko
67
230k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
How STYLIGHT went responsive
nonsquared
100
6.3k
Site-Speed That Sticks
csswizardry
13
1.5k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
540
Build your cross-platform service in a week with App Engine
jlugia
234
19k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
320
Transcript
いつか使ってみたいOperatorたち Cookpad Inc. kazy1991(@101kaz)
マイナーなOperatorの紹介です • アルファベット順のOperatorのリストを読んで 知らなかったものをピックアップしました • 頭の片隅に記憶しておいていつか使ってみたい
Amb • 複数のObservableを引数に取る • 一番先にitemが流れたObservableを採用する • その他のObservableのitemは流れてこない 1/8
Amb Amb
1/8
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
Ambの使いみち • 複数のAPIサーバーに同時にアクセス..? • UIイベントを並べて競わせる..? • 自分は具体的な利用例が考えられなかった..! 1/8
All • 引数にFunc1の条件を渡す • 全てのitemが条件を満たせばtrueを返す • 一つでも条件を満たさない場合faseを返す 2/8
All All(x => x < 10) 5
2/8
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
Allの使いみち • 真偽値に変換されるので、Validation系かな? • こちらも良い例が思いつかなかった..! 2/8
Cache • #cacheを呼ぶとCacheObservableに変換される • 一度購読されると内容は記憶する • 二度目以降に購読された場合は記憶した内容を返す 3/8
Cache Cache
3/8
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
Cacheの使いみち • APIレスポンスを保持するとか..? • 計算量のかかる結果を保存するとか..? • 似たOperatorでreplayもあるけど使い分けはどう なるんだろう..? RxJava- Is
cache() the same as replay()? stackoverflow.com/questions/32522017/rxjava-is-cache-the-same-as-replay 3/8
Cast • 本当にitemをcastするだけのOperator • map(it -> T(it)) のような感じ • マーブルやサンプルコードは省略します
4/8
ElementAt(OrDefault) • 引数に渡したIndexのitemを返す • List#getみたいなOperator • orDefaultも用意されているので安全 • これもマーブルやサンプルコードは省略します 5/8
ToMap/ToMultiMap • itemをMapに変換する • 引数にFunc1を受取り、その中でキー名を決める 6/8
ToMap/ToMultiMap ToMap(k()) { } &OUSZ
&OUSZ &OUSZ &OUSZ &OUSZ 6/8
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
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
ToMap/ToMultiMapの使いみち • アプリケーションロジックで活用できそうな気が する • 今までReduceで頑張って書いてたので書き直した いと思ってる 6/8
Timestamp • 流れてきたitemをTimestampedでwrapする • valueとtimeStampを持つdata-objectを返す • timeStampは内部でScheduler.now()が生成する 7/8
Timestamp timeStamp 5JNF 5JNF 5JNF
5JNF 5JNF 7/8
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
Timestampの使いみち • 処理が行われた時間が把握できるのでパフォーマン ス・チューニングとか..? • これも良いユースケースが見つからなかった 7/8
Sorted/ToSortedList • 流れてきたitemをソートして返す • Func1を渡すことが出来ソート条件も指定可能 • 内部ではCollections.sortを利用している 8/8
Sorted/ToSortedList Sort
8/8
Sorted/ToSortedList [ ] ToSortList
8/8
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
Sortedの使いみち • 今まで、doOnNext(it -> Collections.sort(it)) の様に書いていたので早速活用していきたい • 今すぐ使えそうなOperatorが一つでも見つかってよ かった!
8/8
今日紹介したOperatorたち • Amp • All • Cast • ElementAt •
Cache • Join • ToMap/ToMultiJoin • Timestamp • Sorted/SortedList Join/GroupJoinも気になってたけど時間が足りなかった。。
以上です。ありがとうございました!! Cookpad Inc. kazy1991(@101kaz)