SlideShare a Scribd company logo
1 of 20
Download to read offline
AndroidでEither
2015-09-11 @Shibuya.apk #3
自己紹介
• 白山 文彦
• 株式会社マナボ 技術者
• @fushiroyama
Eitherとは
Either a b = Left a ¦ Right b
失敗または成功を表す
データ型
(error_code, "OK Status")
タプルとちょっと
似てる?
最大の違いはEitherをEither
のままチェインして加工した
り出来る
難しい言い方をすると
「モナド」
Either<Left, Right>
• Left
• (慣習的に)エラーケースの値
• Right
• (慣習的に)正常ケースの値
• rightの正しいと右の意味が掛かってる
こんな感じで使う
Either<Throwable, String> either;
if (response.getCode() != 200) {
either = new Either.Left<>(new RuntimeException("error code");
} else {
either = new Either.Right<>("Right value!");
}
何が嬉しいのか?
おいしくない例
if (either.isRight) {
either.handleRight();
} else {
either.handleLeft();
}
擬似コード
ですよ
おいっしい例
Either<Throwable, String> either;
if (response.getCode() != 200) {
either = new Either.Left<>(new RuntimeException("error code");
} else {
either = new Either.Right<>("Right value!");
}
either.map(String::toUpperCase); 中がRightかLeftか意識し
なくていいのがミソ!
• map / flatMap などおなじみのメソッドがある
• 実体が何であるか気にする必要がないので抽象度が
高く本質にフォーカスしたコードが書ける
• 例外を使わないので複雑な例外ハンドリングが不要
• RxJava/RxAndroidと相性抜群
WeatherApiCreator.create(CurrentWeatherService.class).getByCityName(editTextCity.getText().toString())
.map(currentWeatherResponse -> {
Either<Throwable, String> either;
if (currentWeatherResponse.getCode() != 200) {
either = new Either.Left<>(new RuntimeException("error code: " + currentWeatherResponse.getCode()));
} else {
either = new Either.Right<>("Humidity: " + currentWeatherResponse.getMain().getHumidity());
}
return either;
})
.map(either -> either.map(String::toUpperCase))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
either -> either.apply(
left -> Toast.makeText(this, left.getMessage(), Toast.LENGTH_SHORT).show(),
right -> Toast.makeText(this, right, Toast.LENGTH_SHORT).show()
),
error -> Toast.makeText(this, error.getMessage(), Toast.LENGTH_SHORT).show()
);
• Eitherの実装
• https://gist.github.com/srym/
0959ab481e598f0e4f12
• 使用例のgist
• https://gist.github.com/srym/
8c9ac01b6aad8097d809
• Optionalに関する補足資料
• http://blog.shiroyama.us/blog/2015/08/09/
optional-in-android/
• Eitherに関する補足資料
• http://blog.shiroyama.us/blog/2015/08/10/
either-in-android/
ご清聴ありがとうございました。
マナボはCS担当者を募集しています!

More Related Content

More from Fumihiko Shiroyama

GCP HTTPロードバランサ運用例
GCP HTTPロードバランサ運用例GCP HTTPロードバランサ運用例
GCP HTTPロードバランサ運用例Fumihiko Shiroyama
 
GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発Fumihiko Shiroyama
 
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリFirebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリFumihiko Shiroyama
 
Rxjavaとoptionalで関数型androidしよう
Rxjavaとoptionalで関数型androidしようRxjavaとoptionalで関数型androidしよう
Rxjavaとoptionalで関数型androidしようFumihiko Shiroyama
 
Ops worksに今後期待するところ
Ops worksに今後期待するところOps worksに今後期待するところ
Ops worksに今後期待するところFumihiko Shiroyama
 

More from Fumihiko Shiroyama (7)

GCP HTTPロードバランサ運用例
GCP HTTPロードバランサ運用例GCP HTTPロードバランサ運用例
GCP HTTPロードバランサ運用例
 
GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発
 
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリFirebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
Firebaseで驚くほど簡単に作れるリアルタイムイベントドリブンアプリ
 
Rxjavaとoptionalで関数型androidしよう
Rxjavaとoptionalで関数型androidしようRxjavaとoptionalで関数型androidしよう
Rxjavaとoptionalで関数型androidしよう
 
Ops worksに今後期待するところ
Ops worksに今後期待するところOps worksに今後期待するところ
Ops worksに今後期待するところ
 
Wallet api
Wallet apiWallet api
Wallet api
 
Google io 2013_keynote
Google io 2013_keynoteGoogle io 2013_keynote
Google io 2013_keynote
 

AndroidでEither