Evitare null
Basi di Option
Evitare null è una lezione Scala for Backend Engineering & Functional Programming gratuita su CoddyKit. Questa è la lezione 1 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.
Il problema di null
In molti linguaggi, un valore mancante è rappresentato da null. Tuttavia, null causa il temuto NullPointerException quando si dimentica di verificarlo.
Scala offre un'alternativa più sicura: il tipo Option.
Che cos'è Option?
Option[A] rappresenta un valore che può essere presente oppure no. Ha esattamente due casi:
Some(value)quando esiste un valoreNonequando non esiste alcun valore
Il tipo stesso indica che un valore potrebbe essere assente.
object Main {
def main(args: Array[String]): Unit = {
val present: Option[Int] = Some(42)
val absent: Option[Int] = None
println(present)
println(absent)
}
}Creare Some
Racchiuda un valore esistente in Some per indicare che è sicuramente presente.
object Main {
def main(args: Array[String]): Unit = {
val name: Option[String] = Some("Ada")
println(name)
}
}Rappresentare l'assenza con None
None è l'unico valore utilizzato quando non è presente nulla. Funziona per qualsiasi tipo Option.
object Main {
def lookup(found: Boolean): Option[Int] =
if (found) Some(100) else None
def main(args: Array[String]): Unit = {
println(lookup(true))
println(lookup(false))
}
}Funzioni che possono fallire
Restituire Option rende esplicita nella firma del tipo la possibilità di non ottenere alcun risultato. Chi chiama la funzione non può ignorarla.
object Main {
def findUser(id: Int): Option[String] =
if (id == 1) Some("Grace") else None
def main(args: Array[String]): Unit = {
println(findUser(1))
println(findUser(2))
}
}Verificare con isDefined e isEmpty
isDefined indica se un Option è un Some, mentre isEmpty indica se è None.
object Main {
def main(args: Array[String]): Unit = {
val a: Option[Int] = Some(5)
val b: Option[Int] = None
println(a.isDefined)
println(b.isEmpty)
}
}Eseguire il pattern matching su un Option
Poiché Option è un ADT sealed, è possibile eseguire il pattern matching su di esso. In questo modo si gestiscono chiaramente sia la presenza sia l'assenza.
object Main {
def greet(name: Option[String]): String = name match {
case Some(n) => s"Hello, $n"
case None => "Hello, stranger"
}
def main(args: Array[String]): Unit = {
println(greet(Some("Bo")))
println(greet(None))
}
}Creare Option da valori nullable
Se deve lavorare con codice che restituisce null, lo racchiuda in Option(...). Converte null in None e qualsiasi valore reale in Some.
object Main {
def main(args: Array[String]): Unit = {
val maybe = Option("data")
val nothing = Option(null)
println(maybe)
println(nothing)
}
}La libreria standard restituisce Option
Molti metodi integrati restituiscono già Option invece di rischiare errori. Ad esempio, List.headOption gestisce in sicurezza le liste vuote.
object Main {
def main(args: Array[String]): Unit = {
val xs = List(1, 2, 3)
val empty = List.empty[Int]
println(xs.headOption)
println(empty.headOption)
}
}Perché preferire Option a null?
Option è preferibile a null perché:
- Rende visibili i valori mancanti nel tipo
- Obbliga chi chiama la funzione a gestire il caso di assenza
- Elimina i NullPointerException
- Si combina con map, flatMap e le for-comprehension
Mettere insieme i concetti
Una piccola ricerca che restituisce Option, gestita poi in sicurezza con il pattern matching.
object Main {
val prices = Map("apple" -> 3, "pear" -> 5)
def priceOf(item: String): Option[Int] = prices.get(item)
def main(args: Array[String]): Unit = {
priceOf("apple") match {
case Some(p) => println(s"costs $p")
case None => println("not for sale")
}
println(priceOf("banana"))
}
}Verifica rapida
Verifichi la Sua comprensione di Option.
Riepilogo
Ha imparato a evitare null con Option:
Option[A]èSome(value)oppureNone- Rende esplicita nel tipo la possibile assenza
- Verifichi con
isDefined/isEmptyo con il pattern matching - Utilizzi
Option(x)per racchiudere valori nullable - Metodi della libreria come
headOptioneMap.getrestituiscono Option
Domande Frequenti
La lezione «Evitare null» è gratuita?
Sì — il testo completo di «Evitare null» è 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 «Evitare null»?
Basi di Option 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 1 di 4.
Quanto tempo richiede la lezione «Evitare null»?
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.