Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Waarden Verwerken met de Optional-Klasse | Sectie
Stream-API in Java

bookWaarden Verwerken met de Optional-Klasse

Veeg om het menu te tonen

In Java kunnen variabelen die objecten opslaan een null-waarde bevatten. Dit leidt vaak tot een NullPointerException als null niet correct wordt afgehandeld. Deze fouten maken code minder betrouwbaar en moeilijker te onderhouden. Hier komt Optional van pas.

Zie het als een doos—het kan een waarde bevatten, of leeg zijn. In plaats van if-statements te gebruiken om op null te controleren, werk je met deze "doos" en gebruik je handige methoden om de waarde veilig te verkrijgen als die er is.

Syntax en gebruik van Optional

Het belangrijkste doel van Optional is het voorkomen van NullPointerException door standaardcontroles als if (value != null) te vervangen door meer leesbare methoden.

Er zijn drie manieren om een Optional te maken:

  • Optional.empty() – maakt een lege Optional zonder waarde;
  • Optional.of(value) – omhult het opgegeven object, maar alleen als het gegarandeerd niet null is;
  • Optional.ofNullable(value) – omhult het object, zelfs als het null is, en maakt zo een gevulde of een lege Optional.
Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> emptyOpt = Optional.empty(); Optional<String> optWithValue = Optional.of("Laptop"); Optional<String> optNullable = Optional.ofNullable(null); System.out.println("Empty Optional: " + emptyOpt); System.out.println("Optional with value: " + optWithValue); System.out.println("Optional with null: " + optNullable); } }

Als u null doorgeeft aan Optional.of(value), zal het programma een NullPointerException werpen, dus ofNullable() dient altijd gebruikt te worden voor mogelijk lege waarden.

Waarden ophalen uit Optional

Voor het ophalen van een waarde uit een Optional kan de methode get() gebruikt worden.

Main.java

Main.java

copy
12345678910
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> optWithValue = Optional.of("Laptop"); System.out.println("Final string: " + optWithValue.get()); } }

Hier retourneert get() het daadwerkelijke object dat is opgeslagen in de Optional. Als de Optional echter leeg is (bevat null), zal het aanroepen van get() een NoSuchElementException gooien.

Controleren op een waarde

Bij het werken met Optional moet u controleren of deze een waarde bevat. Een manier om dit te doen is met isPresent(), die true retourneert als er een waarde aanwezig is. Echter, ifPresent() heeft vaak de voorkeur, omdat deze een opgegeven lambda-expressie alleen uitvoert als de waarde bestaat.

Main.java

Main.java

copy
123456789101112131415161718
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); if (productOpt.isPresent()) { System.out.println("Product found: " + productOpt.get()); } else { System.out.println("Product not found."); } // A more concise approach productOpt.ifPresent(product -> System.out.println("Product: " + product)); } }

In het eerste voorbeeld wordt handmatig gecontroleerd op een waarde met isPresent() voordat get() wordt aangeroepen. Het tweede voorbeeld elimineert de noodzaak van een if-instructie door gebruik te maken van een lambda-expressie die alleen wordt uitgevoerd als het product aanwezig is.

Een standaardwaarde opgeven

Soms is het verstandig om een alternatief te retourneren wanneer een waarde ontbreekt. Dit kan met orElse(), waarmee een fallbackwaarde wordt geleverd. Als het genereren van de fallback berekening vereist, is orElseGet() efficiënter, omdat de functie dan alleen wordt uitgevoerd wanneer dat nodig is.

Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); String product = productOpt.orElse("Default product"); System.out.println("Selected product: " + product); String productLazy = productOpt.orElseGet(() -> "Fallback product"); System.out.println("Selected product (lazy): " + productLazy); } }

Het verschil is dat orElse() altijd de fallbackwaarde aanmaakt, zelfs als dit niet nodig is, terwijl orElseGet() de opgegeven functie alleen aanroept als Optional leeg is.

Een uitzondering gooien als waarde ontbreekt

In sommige gevallen is de afwezigheid van een waarde een fout. In dergelijke situaties kan orElseThrow() worden gebruikt om een uitzondering te gooien.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); String product = productOpt.orElseThrow(() -> new RuntimeException("Product not found")); System.out.println("Product: " + product); } }

Hier, als de Optional leeg is, gooit het programma een RuntimeException. Dit is nuttig wanneer een ontbrekende waarde een kritieke fout betekent.

Waarden transformeren

Vaak bevat een Optional complexe objecten, maar is het alleen nodig om met specifieke velden te werken. In zulke gevallen gebruik je map(), dat een opgegeven functie toepast als er een waarde aanwezig is.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable("Laptop"); Optional<Integer> nameLengthOpt = productOpt.map(String::length); nameLengthOpt.ifPresent(length -> System.out.println("Product name length: " + length)); } }

Als de Optional leeg is, retourneert map() eenvoudigweg Optional.empty(). Anders past het String::length toe en retourneert een Optional<Integer>.

Waarden filteren

Soms is het nodig om een waarde alleen te behouden als deze aan een bepaalde voorwaarde voldoet. De methode filter() helpt door de waarde te behouden als het opgegeven predicaat true retourneert, of Optional.empty() terug te geven als niet aan de voorwaarde wordt voldaan.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.of("Laptop"); Optional<String> filteredProductOpt = productOpt.filter(name -> name.length() > 5); filteredProductOpt.ifPresent(name -> System.out.println("Filtered product: " + name)); } }

Als de lengte van de string groter is dan 5, wordt de waarde behouden; anders wordt de Optional leeg.

1. Wat gebeurt er als je get() aanroept op een lege Optional?

2. Wat zal deze code afdrukken?

3. Wat is het resultaat van de volgende code?

4. Welke methode is het meest geschikt om een standaardwaarde te bieden die alleen wordt berekend indien nodig?

question mark

Wat gebeurt er als je get() aanroept op een lege Optional?

Select the correct answer

question mark

Wat zal deze code afdrukken?

Select the correct answer

question mark

Wat is het resultaat van de volgende code?

Select the correct answer

question mark

Welke methode is het meest geschikt om een standaardwaarde te bieden die alleen wordt berekend indien nodig?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 1. Hoofdstuk 31

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Sectie 1. Hoofdstuk 31
some-alt