0Pricing
Scala for Backend Engineering & Functional Programming · درس

getOrElse وfold

استخراج القيم

getOrElse وfold درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في 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/7) وفتح باقي دورة Scala for Backend Engineering & Functional Programming، انتقل إلى CoddyKit PRO. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.

ماذا ستتعلم في «getOrElse وfold»؟

استخراج القيم تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟

لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «getOrElse وfold»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟

نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تجنب null
  2. map وflatMap على Option
  3. getOrElse وfold
  4. Option في for-comprehensions
← العودة إلى Scala for Backend Engineering & Functional Programming