Last active
June 8, 2017 10:31
-
-
Save tksugimoto/ddb7fa0aec591a998978d28efd01088f to your computer and use it in GitHub Desktop.
Scala Option snippet
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
val someValue: Option[Int] = Some(123) | |
val noneValue: Option[Int] = None | |
val doubledSomeValue: Option[Int] = someValue.map(_ * 2) // Some(246) | |
val doubledNoneValue: Option[Int] = noneValue.map(_ * 2) // None | |
// mapで型の変更も可能 | |
val stringifySomeValue: Option[String] = someValue.map(_.toString + "__") // Some("123__") | |
val stringifyNoneValue: Option[String] = noneValue.map(_.toString + "__") // None | |
someValue.foreach { (num: Int) => | |
println(num) // 123 | |
} | |
noneValue.foreach { (num: Int) => | |
println(num) // 実行されない | |
} | |
someValue match { | |
case Some(num) => println(num) // 123 | |
case None => println("None") // 実行されない | |
} | |
noneValue match { | |
case Some(num) => println(num) // 実行されない | |
case None => println("None") // None | |
} | |
// ワンライナーにする例 | |
println(someValue.getOrElse("None")) // 123 | |
println(noneValue.getOrElse("None")) // None | |
val num1: Int = someValue.map { num => | |
num * 2 | |
}.getOrElse(999) // 246 | |
val num2: Int = noneValue.map { num => | |
num * 2 | |
}.getOrElse(999) // 999 | |
// option.getは使うべきではない | |
val num3: Int = someValue.get // 123 | |
// val num4 = noneValue.get // java.util.NoSuchElementException: None.get | |
// flatMap引数の関数の返り値はOption | |
val flatMapRes1: Option[String] = someValue.flatMap((num: Int) => Some("xyz")) // Some("xyz") | |
val flatMapRes2: Option[Nothing] = someValue.flatMap((num: Int) => None) // None | |
val flatMapRes3: Option[String] = noneValue.flatMap((num: Int) => Some("xyz")) // None | |
val flatMapRes4: Option[Nothing] = noneValue.flatMap((num: Int) => None) // None | |
// ※ Nothingになっているのは、flatMapの返り値がSomeになることが無くSomeのときの中身の型が推測できないため | |
// 【上級】flatMapの型引数に渡すと指定も可能(本来は、Noneを直接書くわけではなく、何らかのOption[T]を返す関数などを入れるため不要) | |
// def flatMap[B](f: (A) => Option[B]): Option[B] | |
val flatMapRes5: Option[String] = noneValue.flatMap[String]((num: Int) => None) // None | |
// nest地獄 | |
val maybe1: Option[Int] = Some(1) | |
val maybe2: Option[Int] = Some(2) | |
val maybe3: Option[Int] = Some(3) | |
val maybe4: Option[Int] = Some(4) | |
val maynotbe5: Option[Int] = None | |
val optionTotal1: Option[Int] = maybe1.flatMap { (v1: Int) => | |
maybe2.flatMap { (v2: Int) => | |
maybe3.flatMap { (v3: Int) => | |
maybe4.map { (v4: Int) => | |
v1 + v2 + v3 + v4 | |
} | |
} | |
} | |
} // Some(10) | |
val optionTotal2: Option[Int] = maybe1.flatMap { (v1: Int) => | |
maybe2.flatMap { (v2: Int) => | |
maybe3.flatMap { (v3: Int) => | |
maybe4.flatMap { (v4: Int) => | |
maynotbe5.map { (v5: Int) => | |
v1 + v2 + v3 + v4 + v5 | |
} | |
} | |
} | |
} | |
} // None | |
// for式で整理 | |
for { | |
v1 <- maybe1 | |
v2 <- maybe2 | |
v3 <- maybe3 | |
v4 <- maybe4 | |
} yield v1 + v2 + v3 + v4 // Some(10) | |
// for式で整理 | |
for { | |
v1 <- maybe1 | |
v2 <- maybe2 | |
v3 <- maybe3 | |
v4 <- maybe4 | |
v5 <- maynotbe5 | |
} yield v1 + v2 + v3 + v4 + v5 // None |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment