Scala for Backend Engineering & Functional Programming · Lezione

getOrElse e fold

Estrarre i valori

Lezione 3 di 413 passaggi

getOrElse e fold è una lezione Scala for Backend Engineering & Functional Programming gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Scala for Backend Engineering & Functional Programming, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Scala for Backend Engineering & Functional Programming include 4 lezioni in totale.

Estrarre un valore

Prima o poi è necessario estrarre un valore semplice da un Option, fornendo un valore sensato quando è None.

Scala offre estrattori sicuri come getOrElse e fold per questo scopo.

Usare getOrElse

getOrElse restituisce il valore contenuto in un Some oppure un valore predefinito fornito da Lei quando è None.

Restituisce sempre un valore semplice, mai un 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))
  }
}

Il valore predefinito è valutato in modo lazy

Il valore predefinito in getOrElse viene valutato solo quando l'Option è None. Pertanto, un valore predefinito costoso non comporta alcun costo quando è presente un valore.

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()))
  }
}

Eviti get

Option dispone di un metodo get, ma questo genera un'eccezione su None. Ciò vanifica lo scopo dell'utilizzo di Option.

Preferisca getOrElse, fold o il pattern matching.

orElse per gli Option alternativi

orElse è diverso: restituisce il primo Option se è un Some; altrimenti restituisce un Option alternativo.

Lo usi per provare alternative che a loro volta potrebbero essere vuote.

object Main {
  def main(args: Array[String]): Unit = {
    val primary: Option[Int] = None
    val backup: Option[Int] = Some(42)
    println(primary.orElse(backup))
  }
}

Introduzione a fold

fold gestisce entrambi i casi con una sola chiamata. Si fornisce prima un valore predefinito per None, poi una funzione per il valore di Some.

Restituisce un unico risultato, trasformando il valore quando è presente.

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 su None

Quando l'Option è None, fold restituisce il valore predefinito fornito per primo e ignora la funzione di trasformazione.

object Main {
  def main(args: Array[String]): Unit = {
    val empty: Option[Int] = None
    val result = empty.fold(-1)(x => x * 2)
    println(result)
  }
}

fold verso un tipo diverso

Entrambi i rami di fold devono restituire lo stesso tipo, ma questo tipo può essere diverso dal tipo del valore dell'Option.

Qui trasformiamo un Option[Int] in una 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))
  }
}

Scegliere tra le alternative

Guida rapida:

  • getOrElse: fornisce un valore predefinito dello stesso tipo
  • orElse: fornisce un Option alternativo
  • fold: trasforma il valore e fornisce un valore predefinito in un unico passaggio
  • pattern matching: quando ogni caso richiede una logica più articolata

Combinare con map

Un idioma comune consiste nell'usare prima map per trasformare e poi getOrElse per ottenere un valore semplice.

object Main {
  def main(args: Array[String]): Unit = {
    val name: Option[String] = Some("ada")
    val display = name.map(_.toUpperCase).getOrElse("ANON")
    println(display)
  }
}

Mettere tutto insieme

Cercare un valore di configurazione, fornire un Option alternativo e infine ottenere un valore predefinito con 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)
  }
}

Verifica rapida

Verifichi la Sua comprensione dell'estrazione dei valori dagli Option.

Riepilogo

Ha imparato a estrarre i valori dagli Option in modo sicuro:

  • getOrElse(default) restituisce il valore o un valore predefinito (valutato in modo lazy)
  • orElse(fallback) restituisce il primo Some o un Option alternativo
  • fold(default)(f) trasforma un Some e usa il valore predefinito per un None in un unico passaggio
  • Eviti get, che genera un'eccezione su None
Gratis per iniziare

Impara Scala con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
39
Lezioni
143

Domande Frequenti

La lezione «getOrElse e fold» è gratuita?

Sì — il testo completo di «getOrElse e fold» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Scala for Backend Engineering & Functional Programming, passa a CoddyKit PRO. Il corso Scala for Backend Engineering & Functional Programming include 4 lezioni in totale.

Cosa imparerò in «getOrElse e fold»?

Estrarre i valori Eserciti Scala for Backend Engineering & Functional Programming con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Scala for Backend Engineering & Functional Programming?

Non è richiesta alcuna esperienza precedente. Scala for Backend Engineering & Functional Programming su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «getOrElse e fold»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Scala for Backend Engineering & Functional Programming?

Sì. Ogni lezione Scala for Backend Engineering & Functional Programming include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Evitare null
  2. map e flatMap su Option
  3. getOrElse e fold
  4. Option nelle for-comprehension
← Torna a Scala for Backend Engineering & Functional Programming