Option e nullable: quando utilizzare ciascuno
Confronti il tipo Option di Arrow con i tipi nullable di Kotlin e scelga quello più appropriato.
Option e nullable: quando utilizzare ciascuno è una lezione Kotlin Academy 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 Kotlin Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Kotlin Academy include 4 lezioni in totale.
Due modi per rappresentare l'assenza
Tipi nullable di Kotlin
T? di Kotlin è la scelta idiomatica per rappresentare l'assenza nella maggior parte del codice Kotlin. Il compilatore impone i controlli null, l'operatore di safe call ?. concatena le chiamate in modo sicuro e ?: "default" fornisce fallback in modo conciso:
val name: String? = findUser(id)?.name
val display = name ?: "Anonymous"Option<A> di Arrow
Option racchiude il concetto di nullable in un vero tipo algebrico con map, flatMap, filter, fold e altro ancora. Si integra naturalmente con lo stile delle pipeline funzionali di Arrow:
import arrow.core.Option
import arrow.core.Some
import arrow.core.None
import arrow.core.toOption
val opt: Option<String> = "hello".toOption() // Some("hello")
val absent: Option<String> = NoneConversione tra Option e nullable
Può effettuare liberamente la conversione: value?.toOption() racchiude un nullable in Option; option.getOrNull() estrae il valore oppure null; option.getOrElse { default } fornisce un fallback:
val opt: Option<String> = nullableString.toOption()
val back: String? = opt.getOrNull()map e flatMap su Option
map { } trasforma un valore Some (lasciando invariato None). flatMap { } concatena operazioni che restituiscono a loro volta Option:
val length: Option<Int> = "hello".toOption().map { it.length } // Some(5)
val noneLength: Option<Int> = (null as String?).toOption().map { it.length } // Nonefilter su Option
filter { predicate } converte un Some in None se il predicato è falso:
val positiveAge: Option<Int> = 25.toOption().filter { it > 0 } // Some(25)
val rejectedAge: Option<Int> = (-1).toOption().filter { it > 0 } // Nonefold: consumare Option
fold(ifEmpty, ifSome) gestisce entrambi i casi in un'unica espressione, senza pattern matching:
val result: String = someOption.fold(
ifEmpty = { "Nothing here" },
ifSome = { value -> "Got: $value" }
)Quando preferire il nullable T?
Preferisca il nullable di Kotlin (T?) quando:
- scrive codice Kotlin idiomatico che sarà letto da altre persone
- ha bisogno di catene di operatori null-safe (
?.,?:) - il tipo viene utilizzato in API che non usano Arrow
- le prestazioni sono fondamentali (nessun overhead di boxing)
Quando preferire Option<A>
Preferisca Option quando:
- utilizza già la pipeline funzionale di Arrow (
map,flatMap) - desidera comporre valori opzionali con
EitheroRaise - desidera rendere esplicita l'assenza in un contesto funzionale generico
- sta creando una libreria i cui chiamanti potrebbero non usare Kotlin
Option all'interno di either { }
All'interno del blocco either { } di Arrow, può chiamare .bind() su un Option convertendolo prima in Either:
fun findUserOpt(id: Long): Option<User> = TODO()
fun getUser(id: Long): Either<UserError, User> = either {
findUserOpt(id)
.toEither { UserError.NotFound }
.bind()
}L'anti-pattern di Option
Non utilizzi Option ovunque solo perché esiste. In Kotlin, String? è più chiaro di Option nella maggior parte del codice applicativo. Riservi Option ai casi in cui i suoi operatori funzionali apportano un valore concreto.
Verifica rapida
Che cosa restituisce None.map { it.length } in Option di Arrow?
Riepilogo: Option e tipi nullable
Punti chiave:
- Kotlin
T?: idiomatico per la maggior parte del codice; garantito dal compilatore; utilizza?.e?: - Arrow
Option: tipo algebrico con operatori funzionali (map,flatMap,fold,filter) - Convertire con
.toOption()e.getOrNull() - Preferisca
T?per il Kotlin idiomatico; preferiscaOptionquando compone pipeline funzionali con Arrow
Domande Frequenti
La lezione «Option e nullable: quando utilizzare ciascuno» è gratuita?
Sì — il testo completo di «Option e nullable: quando utilizzare ciascuno» è 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 Kotlin Academy, passa a CoddyKit PRO. Il corso Kotlin Academy include 4 lezioni in totale.
Cosa imparerò in «Option e nullable: quando utilizzare ciascuno»?
Confronti il tipo Option di Arrow con i tipi nullable di Kotlin e scelga quello più appropriato. Eserciti Kotlin Academy 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 Kotlin Academy?
Non è richiesta alcuna esperienza precedente. Kotlin Academy 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 «Option e nullable: quando utilizzare ciascuno»?
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 Kotlin Academy?
Sì. Ogni lezione Kotlin Academy 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
- Either : gestione tipizzata degli errori senza eccezioni
- DSL Raise di Arrow: composizione degli errori tipizzati
- Option e nullable: quando utilizzare ciascuno
- Modellazione funzionale del dominio con i tipi fondamentali di Arrow