Skip to content

Instantly share code, notes, and snippets.

@tksugimoto
Last active June 8, 2017 10:31
Show Gist options
  • Save tksugimoto/ddb7fa0aec591a998978d28efd01088f to your computer and use it in GitHub Desktop.
Save tksugimoto/ddb7fa0aec591a998978d28efd01088f to your computer and use it in GitHub Desktop.
Scala Option snippet
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