溶液をOption.map
とOption.flatMap
使用することである:これは、Option[Int]
を返し
First flatMap(_.second) flatMap(_.third) map(_.numberOfSmth)
(提供:
First.flatMap(_.second.flatMap(_.third.map(_.numberOfSmth)))
または同等(この回答の末尾に更新を参照されたいです)そのnumberOfSmth
はInt
を返します)。コールチェーン内のオプションのいずれかがNone
の場合、結果はNone
になります。そうでない場合はSome(count)
になります。ここで、count
はnumberOfSmth
の戻り値です。
もちろん、これは非常に醜いことができます。この理由のために、scalaは理解のためにをサポートします。は構文的な砂糖です。
(確かにスカラを使用してしばらくする場合のように、あなたはまだ、どこでも
map
/
flatMap
見ることに使用されていない場合は特に)間違いなく進歩して、正確なを生成
for {
first <- First
second <- first .second
third <- second.third
} third.numberOfSmth
:上記のように書き換えることができますフードの下に同じコード。 What is Scala's yield?
UPDATE:flatMapが連想であることを指摘してベン・ジェームズに おかげ
詳細な背景については、この他の質問を確認することができます。つまり、x flatMap(y flatMap z)))
はx flatMap y flatMap z
と同じです。後者は通常短くはありませんが、それは従うのが簡単な入れ子を避けるという利点があります。
scala> val l = Some(1,Some(2,Some(3,"aze")))
l: Some[(Int, Some[(Int, Some[(Int, String)])])] = Some((1,Some((2,Some((3,aze))))))
scala> l.flatMap(_._2.flatMap(_._2.map(_._2)))
res22: Option[String] = Some(aze)
scala> l flatMap(_._2 flatMap(_._2 map(_._2)))
res23: Option[String] = Some(aze)
scala> l flatMap(_._2) flatMap(_._2) map(_._2)
res24: Option[String] = Some(aze)
scala> l.flatMap(_._2).flatMap(_._2).map(_._2)
res25: Option[String] = Some(aze)
だけ音符が、flatMapのwoun」:ここ
は、REPLの一部の図(4つのスタイルは最初の二つは、flatMapの平らなチェーンを使用して、ネストflatMap、他の二つを用いて、等価である)であります以下のように数回働く。 'First.second.flatMap(_。third.flatMap(_。numberOfSmth))。get'でなければならず、まだ例外がスローされている可能性があります。 – korefn
本当にありがとうございます。皆さん、お返事ありがとうございました。私が探していたものを見つけました。 – psisoyev