Oprettelse og inspektion af Optionals
Brug Optional.of, ofNullable, empty, isPresent, isEmpty og get på sikker vis.
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()); // falseisPresent 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())); // JAVAget(): 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 neededorElseThrow
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 userKontrol 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 fallbackfilter 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 foundHurtig 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
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
- Hvorfor findes Optional?
- Oprettelse og inspektion af Optionals
- Transformation af Optionals: map og flatMap
- Best practices for Optional