getOrElse と fold
値を取り出します。
「getOrElse と fold」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはScala for Backend Engineering & Functional Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
このレッスンの一部はまだ翻訳されておらず、英語で表示されています。
Getting a Value Out
Eventually you need to extract a plain value from an Option, supplying something sensible when it is None.
Scala provides safe extractors like getOrElse and fold for this.
Using getOrElse
getOrElse returns the value inside a Some, or a default you provide when it is None.
It always gives you a plain value, never an Option.
object Main {
def main(args: Array[String]): Unit = {
val a: Option[Int] = Some(5)
val b: Option[Int] = None
println(a.getOrElse(0))
println(b.getOrElse(0))
}
}Default Is Lazy
The default in getOrElse is only evaluated when the Option is None. So an expensive default costs nothing when a value is present.
object Main {
def expensiveDefault(): Int = { println("computing default"); 99 }
def main(args: Array[String]): Unit = {
val present: Option[Int] = Some(7)
println(present.getOrElse(expensiveDefault()))
}
}Avoid get
Option has a get method, but it throws an exception on None. This defeats the purpose of using Option.
Prefer getOrElse, fold, or pattern matching instead.
orElse for Fallback Options
orElse is different: it returns the first Option if it is a Some, otherwise it returns a fallback Option.
Use it to try alternatives that themselves may be empty.
object Main {
def main(args: Array[String]): Unit = {
val primary: Option[Int] = None
val backup: Option[Int] = Some(42)
println(primary.orElse(backup))
}
}Introducing fold
fold handles both cases in one call. You give a default for None first, then a function for the Some value.
It returns a single result, transforming the value when present.
object Main {
def main(args: Array[String]): Unit = {
val n: Option[Int] = Some(10)
val result = n.fold(0)(x => x * 2)
println(result)
}
}fold on None
When the Option is None, fold returns the default you gave first, ignoring the transform function.
object Main {
def main(args: Array[String]): Unit = {
val empty: Option[Int] = None
val result = empty.fold(-1)(x => x * 2)
println(result)
}
}fold to a Different Type
Both branches of fold must return the same type, but that type can differ from the Option's value type.
Here we turn an Option[Int] into a String.
object Main {
def describe(o: Option[Int]): String =
o.fold("missing")(x => s"value $x")
def main(args: Array[String]): Unit = {
println(describe(Some(8)))
println(describe(None))
}
}Choosing Between Them
Quick guide:
getOrElse: supply a default value of the same typeorElse: supply a fallback Optionfold: transform the value and supply a default in one step- pattern matching: when each case needs more logic
Combining With map
A common idiom is to map first to transform, then getOrElse to land on a plain value.
object Main {
def main(args: Array[String]): Unit = {
val name: Option[String] = Some("ada")
val display = name.map(_.toUpperCase).getOrElse("ANON")
println(display)
}
}Putting It Together
Look up a config value, provide a fallback Option, then land on a default with getOrElse.
object Main {
val env = Map("timeout" -> "30")
def main(args: Array[String]): Unit = {
val timeout = env.get("timeout")
.flatMap(_.toIntOption)
.getOrElse(60)
println(timeout)
val retries = env.get("retries").fold(3)(_.toInt)
println(retries)
}
}Quick Check
Test your understanding of extracting Option values.
Recap
You learned to extract Option values safely:
getOrElse(default)returns the value or a default (lazily evaluated)orElse(fallback)returns the first Some or a fallback Optionfold(default)(f)transforms a Some and defaults a None in one step- Avoid
get, which throws on None
よくある質問
「getOrElse と fold」レッスンは無料ですか?
はい。「getOrElse と fold」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Scala for Backend Engineering & Functional Programmingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
「getOrElse と fold」で何を学びますか?
値を取り出します。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Scala for Backend Engineering & Functional Programmingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのScala for Backend Engineering & Functional Programmingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「getOrElse と fold」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?
はい。すべてのScala for Backend Engineering & Functional Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- null を避ける
- Option の map と flatMap
- getOrElse と fold
- for 内の Option