📘
for 内包表記内で Futre[Bool] の結果でエラーにする処理を見やすくする
Scala で次のようなコードに遭遇しました.
for {
result <- FutureBoolFunction
hogehoge <- if (result) {
for {
a <- FutureSomeFunc1
b <- FutureSomeFunc2
...
} yield fugafuga
} else {
Future.failed(new Exception("error"))
}
} yield hogehoge
この処理は
- FutureBoolFunction の結果を受け取る
- if で結果を評価する
- true の場合は for 内包表記をネストして処理を続行する
- else の場合は Failure にする
続投する処理が内包表記でネストしています。この場合
for {
result <- FutureBoolFunction
_ <- if (result) {
Future.unit
} else {
Future.failed(new Exception("error"))
}
a <- FutureSomeFunc1
b <- FutureSomeFunc2
...
} yield hogehoge
と書けば解決します。
関数を定義する
毎度 if-else でやると面倒なので関数を定義します。
def when(cond: Boolean)(a: => Future[Unit]): Future[Unit] = if (cond) a else Future.unit
when を使うとこのようにかけます。
for {
result <- FutureBoolFunction
_ <- when (!result) { Future.failed(new Exception("error"))}
a <- FutureSomeFunc1
b <- FutureSomeFunc2
...
} yield hogehoge
だいぶスッキリしました。:)
Discussion