SlideShare a Scribd company logo
1 of 19
Download to read offline
Kotlin と RxJava2
Naoto Nakazato
自己紹介
● Naoto Nakazato
● Recruit Lifestyle
● HOT PEPPER Beauty
● アカウント
○ Twitter: @oxsoft
○ Facebook: naoto.nakazato
○ GitHub: oxsoft
○ Qiita: oxsoft
今日お話しすること
KotlinはNullable/NonNullを扱える
RxJava2がNonNullになってMaybe/Completableが追加された
Maybe<T> は Single<T?> みたいなもの?
今日お話しすること
Maybe<T> は Single<T?> みたいなもの?
Kotlinの拡張関数の活用してみた事例
RxJava2の話が多くなってしまってすみません
サンプルコード
https://github.com/oxsoft/kotlin-rxjava2-sample
RxJava2について
RxJava2について
RxJavaはリアクティブプログラミングのためのライブラリで、
非同期処理や、オブザーバパターンの実装が簡単にできるようになります。
RxJava2では、ストリームにnullが流せないようになりました(null安全的な)
また、Maybe<T>とCompletable<T>などが追加されました。
RxJava2について
● Single<T>:valueかerrorが1度だけ流れる
● Maybe<T>:valueかemptyかerrorが1度だけ流れる
● Completable<T>:emptyかerrorが1度だけ流れる
value: T empty error
Single<T>
Maybe<T>
Completable<T>
Maybe<T> は Single<T?> みたいなもの?
Maybe<T> Single<T?>
T T
empty
null
NoSuchElementException
Throwable Throwable
Maybe.emptyのnullっぽさ
● maybe.blockingGet() は null を返すことがある
● Maybe.fromCallable { null } は empty になる
● maybe.doOnEvent {...} は null,null が来ることがある
Maybe.emptyのnullっぽくなさ
● Maybe.just(null)はできない
○ Maybe.empty()を使う
● Maybe.map { null } はできない
● Maybe.map {...} はnullの時は何もしない
○ defaultIfEmptyを使う
● maybe.toSingle() は NoSuchElementException になりうる
● maybe.flatMapSingle() は NoSuchElementException になりうる
○ switchIfEmptyを使う
KotlinにMaybeは不要では?
Maybe<T>をSingle<T?>っぽく扱うために
解決するには、RxKotlinを使う!※
のではなく、
1. 単純にラップする
2. Extensionで頑張る
※RxKotlinはKotlinのクラスをRxJavaのクラスに変換する拡張関数集
単純にラップする
class Container<out T>(val v: T)
を定義して、
Maybe<T> の代わりに Single<Container<T?>> を使う
ただ、徹底するのが面倒
Extensionで頑張る
例えば以下の3つのパターンを考えてみる
● empty も受けられて null も返せる map
● empty も受けられて null は返さない map
● empty も受けられる flatMapSingle
emptyも受けられてnullも返せるmap
Maybe のままなので lift を使うことで実現できる
fun <T, R> Maybe<T>.mapNullable(mapper: (T?) -> R?): Maybe<R> =
this.lift { observer -> object : MaybeObserver<T> {
}
}
override fun onComplete() {
val r = mapper(null)
if (r == null) {
observer.onComplete()
} else {
observer.onSuccess(r)
}
}
override fun onSuccess(t: T) {
val r = mapper(t)
if (r == null) {
observer.onComplete()
} else {
observer.onSuccess(r)
}
}
emptyも受けられてnullは返さないmap
fun <T, R> Maybe<T>.mapToSingle(mapper: (T?) -> R) =
this.map(mapper)
.switchIfEmpty(Single.fromCallable { mapper(null) })
オペレータの組み合わせで実現できる
※以下のようにしてしまうと、呼び出し時に mapper(null) が評価されてしまう
this.map(mapper).toSingle(mapper(null))
emptyも受けられるflatMapSingle
fun <T, R> Maybe<T>.flatMapSingleSafe(mapper: (T?) -> Single<R>): Single<R> =
this.flatMapSingleElement(mapper)
.switchIfEmpty(Single.just(Unit).flatMap { mapper(null) })
オペレータの組み合わせで実現できる
※以下のようにしてしまうと、呼び出し時に mapper(null) が評価されてしまう
this.flatMapSingleElement(mapper).switchIfEmpty(mapper(null))
※拡張関数を乱用しない
拡張関数は便利ですが、普通の関数と見分けがつきにくく、
乱用するとカオスになるので、メンバーが合意できる範囲で、
用法用量を守って使いたいです
まとめ
Maybe<T> は Single<T?> とは違うものだけど
KotlinにはExtensionがあるので、
(メンバーが合意できる範囲で)カスタマイズできる!
RxJava以外にも、おススメExtensionがあれば教えてください

More Related Content

What's hot

WebSocketのキホン
WebSocketのキホンWebSocketのキホン
WebSocketのキホン
You_Kinjoh
 

What's hot (20)

銀行 API における OAuth 2.0 / FAPI の動向 #openid #bizday
銀行 API における OAuth 2.0 / FAPI の動向 #openid #bizday銀行 API における OAuth 2.0 / FAPI の動向 #openid #bizday
銀行 API における OAuth 2.0 / FAPI の動向 #openid #bizday
 
[CTO Night & Day 2019] Amazon Pinpoint でかゆいところに手が届くユーザー動向分析とセグメント通知 #ctonight
[CTO Night & Day 2019] Amazon Pinpoint でかゆいところに手が届くユーザー動向分析とセグメント通知 #ctonight[CTO Night & Day 2019] Amazon Pinpoint でかゆいところに手が届くユーザー動向分析とセグメント通知 #ctonight
[CTO Night & Day 2019] Amazon Pinpoint でかゆいところに手が届くユーザー動向分析とセグメント通知 #ctonight
 
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
レイヤードアーキテクチャを意識したPHPアプリケーションの構築レイヤードアーキテクチャを意識したPHPアプリケーションの構築
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
 
AWSの課金体系
AWSの課金体系AWSの課金体系
AWSの課金体系
 
全自動Zabbix ver2
全自動Zabbix ver2全自動Zabbix ver2
全自動Zabbix ver2
 
Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析
Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析
Amazon Kinesis Analytics によるストリーミングデータのリアルタイム分析
 
KeycloakでAPI認可に入門する
KeycloakでAPI認可に入門するKeycloakでAPI認可に入門する
KeycloakでAPI認可に入門する
 
Serverless時代のJavaについて
Serverless時代のJavaについてServerless時代のJavaについて
Serverless時代のJavaについて
 
WebSocketのキホン
WebSocketのキホンWebSocketのキホン
WebSocketのキホン
 
FlutterでGraphQLを扱う
FlutterでGraphQLを扱うFlutterでGraphQLを扱う
FlutterでGraphQLを扱う
 
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #1320210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
 
AWS CLIでAssumeRole
AWS CLIでAssumeRoleAWS CLIでAssumeRole
AWS CLIでAssumeRole
 
20190604 AWS Black Belt Online Seminar Amazon Simple Notification Service (SNS)
20190604 AWS Black Belt Online Seminar Amazon Simple Notification Service (SNS)20190604 AWS Black Belt Online Seminar Amazon Simple Notification Service (SNS)
20190604 AWS Black Belt Online Seminar Amazon Simple Notification Service (SNS)
 
20190410 AWS Black Belt Online Seminar Amazon Elastic Container Service for K...
20190410 AWS Black Belt Online Seminar Amazon Elastic Container Service for K...20190410 AWS Black Belt Online Seminar Amazon Elastic Container Service for K...
20190410 AWS Black Belt Online Seminar Amazon Elastic Container Service for K...
 
App013 ここはあえて紙と
App013 ここはあえて紙とApp013 ここはあえて紙と
App013 ここはあえて紙と
 
20190911 AWS Black Belt Online Seminar AWS Batch
20190911 AWS Black Belt Online Seminar AWS Batch20190911 AWS Black Belt Online Seminar AWS Batch
20190911 AWS Black Belt Online Seminar AWS Batch
 
AWS Black Belt Online Seminar AWS Direct Connect
AWS Black Belt Online Seminar AWS Direct ConnectAWS Black Belt Online Seminar AWS Direct Connect
AWS Black Belt Online Seminar AWS Direct Connect
 
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
ホットペッパービューティーにおけるモバイルアプリ向けAPIのBFF/Backend分割
 
全自動Zabbix
全自動Zabbix全自動Zabbix
全自動Zabbix
 
20191120 AWS Black Belt Online Seminar Amazon Managed Streaming for Apache Ka...
20191120 AWS Black Belt Online Seminar Amazon Managed Streaming for Apache Ka...20191120 AWS Black Belt Online Seminar Amazon Managed Streaming for Apache Ka...
20191120 AWS Black Belt Online Seminar Amazon Managed Streaming for Apache Ka...
 

More from Recruit Lifestyle Co., Ltd.

More from Recruit Lifestyle Co., Ltd. (20)

業務と消費者の体験を同時にデザインするリクルートの価値検証のリアル ー 「Airレジ ハンディ」セルフオーダーのブレない「価値」の確かめ方 ー
業務と消費者の体験を同時にデザインするリクルートの価値検証のリアル ー 「Airレジ ハンディ」セルフオーダーのブレない「価値」の確かめ方 ー業務と消費者の体験を同時にデザインするリクルートの価値検証のリアル ー 「Airレジ ハンディ」セルフオーダーのブレない「価値」の確かめ方 ー
業務と消費者の体験を同時にデザインするリクルートの価値検証のリアル ー 「Airレジ ハンディ」セルフオーダーのブレない「価値」の確かめ方 ー
 
分散トレーシングAWS:X-Rayとの上手い付き合い方
分散トレーシングAWS:X-Rayとの上手い付き合い方分散トレーシングAWS:X-Rayとの上手い付き合い方
分散トレーシングAWS:X-Rayとの上手い付き合い方
 
OOUIを実践してわかった、9つの大切なこと
OOUIを実践してわかった、9つの大切なことOOUIを実践してわかった、9つの大切なこと
OOUIを実践してわかった、9つの大切なこと
 
Flutter移行の苦労と、乗り越えた先に得られたもの
Flutter移行の苦労と、乗り越えた先に得られたものFlutter移行の苦労と、乗り越えた先に得られたもの
Flutter移行の苦労と、乗り越えた先に得られたもの
 
CTIサービスを支える裏側 〜物理デバイスとの戦い〜 | iOSDC Japan 2020
CTIサービスを支える裏側 〜物理デバイスとの戦い〜 | iOSDC Japan 2020CTIサービスを支える裏側 〜物理デバイスとの戦い〜 | iOSDC Japan 2020
CTIサービスを支える裏側 〜物理デバイスとの戦い〜 | iOSDC Japan 2020
 
「進化し続けるインフラ」のためのマルチアカウント管理
「進化し続けるインフラ」のためのマルチアカウント管理「進化し続けるインフラ」のためのマルチアカウント管理
「進化し続けるインフラ」のためのマルチアカウント管理
 
Air事業のデザイン組織とデザイナー
Air事業のデザイン組織とデザイナーAir事業のデザイン組織とデザイナー
Air事業のデザイン組織とデザイナー
 
リクルートライフスタイル AirシリーズでのUXリサーチ
リクルートライフスタイル AirシリーズでのUXリサーチリクルートライフスタイル AirシリーズでのUXリサーチ
リクルートライフスタイル AirシリーズでのUXリサーチ
 
データサイエンティストが力を発揮できるアジャイルデータ活用基盤
データサイエンティストが力を発揮できるアジャイルデータ活用基盤データサイエンティストが力を発揮できるアジャイルデータ活用基盤
データサイエンティストが力を発揮できるアジャイルデータ活用基盤
 
Real-time personalized recommendation using embedding
Real-time personalized recommendation using embeddingReal-time personalized recommendation using embedding
Real-time personalized recommendation using embedding
 
データから価値を生み続けるには
データから価値を生み続けるにはデータから価値を生み続けるには
データから価値を生み続けるには
 
データプロダクト開発を成功に導くには
データプロダクト開発を成功に導くにはデータプロダクト開発を成功に導くには
データプロダクト開発を成功に導くには
 
Jupyter だけで機械学習を実サービス展開できる基盤
Jupyter だけで機械学習を実サービス展開できる基盤Jupyter だけで機械学習を実サービス展開できる基盤
Jupyter だけで機械学習を実サービス展開できる基盤
 
SQLを書くだけでAPIが作れる基盤
SQLを書くだけでAPIが作れる基盤SQLを書くだけでAPIが作れる基盤
SQLを書くだけでAPIが作れる基盤
 
BtoBサービスならではの顧客目線の取り入れ方
BtoBサービスならではの顧客目線の取り入れ方BtoBサービスならではの顧客目線の取り入れ方
BtoBサービスならではの顧客目線の取り入れ方
 
The Design for Serverless ETL Pipeline データ分析基盤のレガシーなデータロードをサーバレスでフルリプレースするまで道のり
The Design for Serverless ETL Pipeline データ分析基盤のレガシーなデータロードをサーバレスでフルリプレースするまで道のりThe Design for Serverless ETL Pipeline データ分析基盤のレガシーなデータロードをサーバレスでフルリプレースするまで道のり
The Design for Serverless ETL Pipeline データ分析基盤のレガシーなデータロードをサーバレスでフルリプレースするまで道のり
 
リクルートライフスタイルにおける深層学習の活用とGCPでの実現方法
リクルートライフスタイルにおける深層学習の活用とGCPでの実現方法リクルートライフスタイルにおける深層学習の活用とGCPでの実現方法
リクルートライフスタイルにおける深層学習の活用とGCPでの実現方法
 
ビックデータ分析基盤の成⻑の軌跡
ビックデータ分析基盤の成⻑の軌跡ビックデータ分析基盤の成⻑の軌跡
ビックデータ分析基盤の成⻑の軌跡
 
Refactoring point of Kotlin application
Refactoring point of Kotlin applicationRefactoring point of Kotlin application
Refactoring point of Kotlin application
 
データサイエンティストとエンジニア 両者が幸せになれる機械学習基盤を求めて
データサイエンティストとエンジニア 両者が幸せになれる機械学習基盤を求めてデータサイエンティストとエンジニア 両者が幸せになれる機械学習基盤を求めて
データサイエンティストとエンジニア 両者が幸せになれる機械学習基盤を求めて
 

Kotlin と Rxjava2