Scala för backendutveckling och funktionell programmering · Lektion

Undvik null

Grunderna i Option.

Lektion 1 av 413 steg

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 finns
  • None nä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] är Some(value) eller None
  • Den gör möjlig frånvaro tydlig i typen
  • Kontrollera med isDefined/isEmpty eller mönstermatchning
  • Använd Option(x) för att omsluta nullbara värden
  • Biblioteksmetoder som headOption och Map.get returnerar Option
Gratis att börja

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.

Alla lektioner i den här kursen

  1. Undvik null
  2. map och flatMap på Option
  3. getOrElse och fold
  4. Option i for-comprehensions
← Tillbaka till Scala för backendutveckling och funktionell programmering