Java Academy · Lektion

Oprettelse og inspektion af Optionals

Brug Optional.of, ofNullable, empty, isPresent, isEmpty og get på sikker vis.

Lektion 2 af 413 trin

Oprettelse og inspektion af Optionals er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.

Oprettelse og undersøgelse af Optional-værdier

Denne lektion gennemgår metoderne til at oprette Optional-instanser og undersøge deres indhold: isPresent, isEmpty, get og sikre alternativer.

Tre måder at oprette en Optional på

Opret en Optional med Optional.of(), Optional.ofNullable() eller Optional.empty().

import java.util.Optional;

// 1. of: must be non-null
Optional<String> a = Optional.of("hello");

// 2. ofNullable: safely wraps null
String maybeNull = null;
Optional<String> b = Optional.ofNullable(maybeNull); // empty
Optional<String> c = Optional.ofNullable("world");   // present

// 3. empty: explicitly empty
Optional<Integer> empty = Optional.empty();

System.out.println(a.isPresent()); // true
System.out.println(b.isPresent()); // false
System.out.println(c.isEmpty());   // false

isPresent og isEmpty

isPresent() returnerer true, hvis der findes en værdi. isEmpty() (Java 11+) er den logiske modsætning.

import java.util.Optional;

Optional<String> opt = Optional.of("Java");

System.out.println(opt.isPresent()); // true
System.out.println(opt.isEmpty());   // false

Optional<String> empty = Optional.empty();
System.out.println(empty.isPresent()); // false
System.out.println(empty.isEmpty());   // true

// Prefer ifPresent() over if (isPresent()) get() — more readable
opt.ifPresent(v -> System.out.println(v.toUpperCase())); // JAVA

get(): Brug med forsigtighed

get() returnerer værdien eller kaster NoSuchElementException. Kald den aldrig uden først at kontrollere værdien.

import java.util.Optional;

Optional<String> opt = Optional.of("present");
System.out.println(opt.get()); // present

Optional<String> empty = Optional.empty();
try {
    empty.get(); // NoSuchElementException!
} catch (java.util.NoSuchElementException e) {
    System.out.println("No value!");
}

// Better pattern: always use orElse/orElseGet/orElseThrow
// instead of isPresent() + get()

orElse og orElseGet

orElse(default) returnerer standardværdien, hvis Optional er tom. orElseGet(supplier) kalder leverandøren dovent — det er bedre ved dyre standardværdier.

import java.util.Optional;

Optional<String> plan = Optional.empty();

// orElse: default value always evaluated
String basic = plan.orElse("FREE");
System.out.println(basic); // FREE

// orElseGet: supplier only called when empty (lazy)
String lazy = plan.orElseGet(() -> {
    System.out.println("Computing default...");
    return "FREE";
});
System.out.println(lazy); // Computing default... FREE

// When present, orElseGet supplier is NOT called
Optional.of("PRO").orElseGet(() -> {
    System.out.println("Not called!");
    return "FREE";
}); // silent — present, no computation needed

orElseThrow

orElseThrow() kaster NoSuchElementException eller en brugerdefineret undtagelse, hvis Optional er tom. Brug den, når den manglende værdi reelt er en fejl.

import java.util.Optional;

Optional<String> userId = Optional.empty();

// Default: throws NoSuchElementException
try {
    userId.orElseThrow();
} catch (java.util.NoSuchElementException e) {
    System.out.println("Empty!");
}

// Custom exception
try {
    userId.orElseThrow(() -> new IllegalStateException("User ID required"));
} catch (IllegalStateException e) {
    System.out.println(e.getMessage()); // User ID required
}

ifPresent og ifPresentOrElse

Disse metoder lader dig handle på værdien uden at trække den ud. Det er en ren måde at håndtere bivirkninger på.

import java.util.Optional;

Optional<String> username = Optional.of("alice");

// ifPresent: callback only when present
username.ifPresent(u -> System.out.println("Welcome, " + u));
// Welcome, alice

Optional<String> missing = Optional.empty();

// ifPresentOrElse (Java 9+): callback or else action
missing.ifPresentOrElse(
    u -> System.out.println("Hello " + u),
    () -> System.out.println("Anonymous user")
);
// Anonymous user

Kontrol af, om en streng findes

Et almindeligt anvendelsesområde er at returnere en standardværdi, når en konfigurationsstreng mangler eller er tom.

import java.util.Optional;

static Optional<String> getConfig(String key) {
    // Simulate config lookup
    return Optional.ofNullable(System.getenv(key));
}

String port = getConfig("PORT").orElse("8080");
String host = getConfig("HOST").orElse("localhost");

System.out.println("Server: " + host + ":" + port);
// Server: localhost:8080 (when env vars not set)

Optional.or() til alternative Optional-værdier

or() (Java 9+) returnerer selve Optional-værdien, hvis den findes, eller en anden Optional-værdi leveret af en leverandør.

import java.util.Optional;

static Optional<String> findInCache(String key)   { return Optional.empty(); }
static Optional<String> findInDatabase(String key) { return Optional.of("Alice"); }

Optional<String> result = findInCache("user:1")
    .or(() -> findInDatabase("user:1"));

System.out.println(result.get()); // Alice

// Useful for fallback chains:
Optional<String> value = Optional.empty()
    .or(() -> Optional.empty())
    .or(() -> Optional.of("final fallback"));
System.out.println(value.get()); // final fallback

filter til betinget tilstedeværelse

filter(predicate) beholder kun værdien, hvis den opfylder prædikatet, og returnerer ellers en tom Optional.

import java.util.Optional;

Optional<Integer> age = Optional.of(17);

Optional<Integer> adult = age.filter(a -> a >= 18);
System.out.println(adult.isPresent()); // false (17 is not >= 18)

Optional<Integer> age2 = Optional.of(25);
Optional<Integer> adult2 = age2.filter(a -> a >= 18);
System.out.println(adult2.get()); // 25

// Chain: find active premium user
Optional<User> premiumActive = findUser(id)
    .filter(u -> "PRO".equals(u.plan()))
    .filter(u -> u.isActive());

Praktisk eksempel: Brugeropslag med reserveværdi

Kombination af isPresent, orElse og ifPresentOrElse i et realistisk scenarie med brugeropslag.

import java.util.Optional;

record User(long id, String name, String email) {}

static Optional<User> findById(long id) {
    return id == 1 ? Optional.of(new User(1, "Alice", "alice@co.com"))
                   : Optional.empty();
}

static void displayUser(long id) {
    findById(id).ifPresentOrElse(
        u -> System.out.println("Found: " + u.name() + " <" + u.email() + ">"),
        () -> System.out.println("User " + id + " not found")
    );
}

displayUser(1);  // Found: Alice <alice@co.com>
displayUser(99); // User 99 not found

Hurtig kontrol

Hvad gør orElseGet() anderledes end orElse()?

Opsummering: Oprettelse og undersøgelse af Optional-værdier

Vigtigste pointer:

  • Optional.of() kræver en værdi, der ikke er null; Optional.ofNullable() accepterer null
  • isPresent() / isEmpty() kontrollerer, om der findes en værdi; undgå at kalde get() uden først at kontrollere det
  • orElse() til billige standardværdier; orElseGet() til dyre, beregnede standardværdier
  • orElseThrow(), når en manglende værdi er en fejl
  • ifPresent() og ifPresentOrElse() til bivirkninger uden at trække værdien ud
  • filter() beholder kun værdien, hvis prædikatet accepterer den; or() kæder reserve-Optional-værdier
Gratis at komme i gang

Lær Java med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
104
Lektioner
374

Ofte stillede spørgsmål

Er lektionen “Oprettelse og inspektion af Optionals” gratis?

Ja — hele teksten til “Oprettelse og inspektion af Optionals” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Oprettelse og inspektion af Optionals”?

Brug Optional.of, ofNullable, empty, isPresent, isEmpty og get på sikker vis. Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Java Academy?

Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Oprettelse og inspektion af Optionals”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Java Academy-lektion?

Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Hvorfor findes Optional?
  2. Oprettelse og inspektion af Optionals
  3. Transformation af Optionals: map og flatMap
  4. Best practices for Optional
← Tilbage til Java Academy