Undvik null
Grunderna i Option.
Undvik null är en gratis lektion i Scala för backendutveckling och funktionell programmering på CoddyKit. Detta är lektion 1 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Scala för backendutveckling och funktionell programmering, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Scala för backendutveckling och funktionell programmering innehåller totalt 4 lektioner.
Problemet med null
I många språk representeras ett saknat värde av null. Men null orsakar det fruktade NullPointerException när du glömmer att kontrollera det.
Scala erbjuder ett säkrare alternativ: typen Option.
Vad är Option?
Option[A] representerar ett värde som kanske finns och kanske inte finns. Den har exakt två fall:
Some(value)när ett värde finnsNonenär inget värde finns
Typen själv talar om att ett värde kan saknas.
object Main {
def main(args: Array[String]): Unit = {
val present: Option[Int] = Some(42)
val absent: Option[Int] = None
println(present)
println(absent)
}
}Skapa Some
Omslut ett befintligt värde i Some för att ange att det definitivt finns.
object Main {
def main(args: Array[String]): Unit = {
val name: Option[String] = Some("Ada")
println(name)
}
}Representera frånvaro med None
None är det enda värdet som används när inget finns. Det fungerar för alla Option-typer.
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))
}
}Funktioner som kan misslyckas
Om du returnerar Option blir möjligheten att inget resultat finns tydlig i typsignaturen. Anropande kod kan inte ignorera den.
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))
}
}Kontrollera med isDefined och isEmpty
isDefined anger om en Option är en Some, och isEmpty anger om den är 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)
}
}Mönstermatcha en Option
Eftersom Option är en sealed ADT kan du mönstermatcha mot den. Det hanterar både närvaro och frånvaro på ett tydligt sätt.
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))
}
}Option från nullbara värden
Om du måste arbeta med kod som returnerar null kan du omsluta den med Option(...). Det omvandlar null till None och alla riktiga värden till Some.
object Main {
def main(args: Array[String]): Unit = {
val maybe = Option("data")
val nothing = Option(null)
println(maybe)
println(nothing)
}
}Standardbiblioteket returnerar Option
Många inbyggda metoder returnerar redan Option i stället för att riskera fel. Till exempel hanterar List.headOption tomma listor på ett säkert sätt.
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)
}
}Varför Option i stället för null?
Option är bättre än null eftersom den:
- Gör saknade värden synliga i typen
- Tvingar anropande kod att hantera fallet där värdet saknas
- Eliminerar NullPointerExceptions
- Kan kombineras med map, flatMap och for-comprehensions
Sätta ihop allt
En liten uppslagning som returnerar Option och sedan hanteras säkert med mönstermatchning.
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"))
}
}Snabbtest
Testa dina kunskaper om Option.
Sammanfattning
Du har lärt dig att undvika null med Option:
Option[A]ärSome(value)ellerNone- Den gör möjlig frånvaro tydlig i typen
- Kontrollera med
isDefined/isEmptyeller mönstermatchning - Använd
Option(x)för att omsluta nullbara värden - Biblioteksmetoder som
headOptionochMap.getreturnerar Option
Lär dig Scala med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 39
- Lektioner
- 143
Vanliga frågor
Är lektionen ”Undvik null” gratis?
Ja – hela texten till ”Undvik null” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Scala för backendutveckling och funktionell programmering, kan Ni uppgradera till CoddyKit PRO. Kursen i Scala för backendutveckling och funktionell programmering innehåller totalt 4 lektioner.
Vad lär jag mig i ”Undvik null”?
Grunderna i Option. Ni övar på Scala för backendutveckling och funktionell programmering med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Scala för backendutveckling och funktionell programmering?
Du behöver inga förkunskaper. Utbildningen i Scala för backendutveckling och funktionell programmering på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.
Hur lång tid tar lektionen ”Undvik null”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Scala för backendutveckling och funktionell programmering-lektionen?
Ja. Varje Scala för backendutveckling och funktionell programmering-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.