0Pricing
Scala for Backend Engineering & Functional Programming · レッスン

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 type
  • orElse: supply a fallback Option
  • fold: 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 Option
  • fold(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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. null を避ける
  2. Option の map と flatMap
  3. getOrElse と fold
  4. for 内の Option
← Scala for Backend Engineering & Functional Programmingに戻る