Java 9 optionele API-toevoegingen

1. Overzicht

In dit artikel zullen we kijken naar de Java 9-toevoegingen aan het Optioneel API.

Naast modulariteit voegt Java 9 ook drie zeer nuttige methoden toe voor de Optioneel klasse.

2. Het of() Methode

Soms, wanneer onze Optioneel leeg is, willen we een andere actie uitvoeren die ook een O retourneertptioneel.

Voorafgaand aan Java 9 het Optioneel klasse had alleen de of anders() en orElseGet () methoden, maar beide moeten onverpakte waarden retourneren.

Java 9 introduceert het of() methode die een andere retourneert Optioneel lui als onze Optioneel is leeg. Als onze eerste Optioneel heeft een gedefinieerde waarde, de lambda doorgegeven aan de of() methode wordt niet aangeroepen en de waarde wordt niet berekend en geretourneerd:

@Test openbare leegte gegevenOptional_whenPresent_thenShouldTakeAValueFromIt () {// gegeven String verwacht = "properValue"; Optionele waarde = Optioneel.of (verwacht); Optioneel defaultValue = Optioneel.of ("default"); // when Optioneel resultaat = waarde.or (() -> defaultValue); // dan assertThat (result.get ()). isEqualTo (verwacht); }

In het geval van Optioneel being leeg, de teruggekeerde resultaat zal hetzelfde zijn als de standaardwaarde:

@Test openbare leegte gegevenOptional_whenEmpty_thenShouldTakeAValueFromOr () {// gegeven String defaultString = "default"; Optionele waarde = Optioneel.empty (); Optioneel defaultValue = Optioneel.of (defaultString); // when Optioneel resultaat = waarde.or (() -> defaultValue); // dan assertThat (result.get ()). isEqualTo (defaultString); }

3. Het ifPresentOrElse () Methode

Als we een Optioneel Zo willen we vaak een specifieke actie uitvoeren op de onderliggende waarde ervan. Aan de andere kant, als het Optioneel is leeg we willen het loggen of dat feit volgen door een metriek te verhogen.

De ifPresentOrElse () methode is precies voor dergelijke scenario's gemaakt. We kunnen een Klant dat zal worden aangeroepen als de Optioneel is gedefinieerd, en Runnable dat wordt uitgevoerd als het Optioneel is leeg.

Laten we zeggen dat we een gedefinieerd hebben Optioneel en we willen een specifieke teller verhogen als de waarde aanwezig is:

@Test openbare leegte gegevenOptional_whenPresent_thenShouldExecuteProperCallback () {// gegeven Optionele waarde = Optioneel.of ("properValue"); AtomicInteger successCounter = nieuwe AtomicInteger (0); AtomicInteger onEmptyOptionalCounter = nieuwe AtomicInteger (0); // when value.ifPresentOrElse (v -> successCounter.incrementAndGet (), onEmptyOptionalCounter :: incrementAndGet); // dan assertThat (successCounter.get ()). isEqualTo (1); assertThat (onEmptyOptionalCounter.get ()). isEqualTo (0); }

Merk op dat de callback is geslaagd omdat het tweede argument niet werd uitgevoerd.

In het geval van een leeg Optioneel, de tweede callback wordt uitgevoerd:

@Test openbare leegte gegevenOptional_whenNotPresent_thenShouldExecuteProperCallback () {// gegeven Optionele waarde = Optioneel.empty (); AtomicInteger successCounter = nieuwe AtomicInteger (0); AtomicInteger onEmptyOptionalCounter = nieuwe AtomicInteger (0); // when value.ifPresentOrElse (v -> successCounter.incrementAndGet (), onEmptyOptionalCounter :: incrementAndGet); // dan assertThat (successCounter.get ()). isEqualTo (0); assertThat (onEmptyOptionalCounter.get ()). isEqualTo (1); }

4. Het stroom() Methode

De laatste methode, die wordt toegevoegd aan de Optioneel klasse in de Java 9, is de stroom() methode.

Java heeft een zeer vloeiend en elegant Stroom API die op de collecties kan werken en veel functionele programmeerconcepten gebruikt. De nieuwste Java-versie introduceert de stroom() methode op de Optioneel klasse dat stelt ons in staat om de Optioneel instantie als een Stroom.

Laten we zeggen dat we een gedefinieerd hebben Optioneel en we noemen de stroom() methode erop. Dit zal een Stroom van één element waarop we alle methoden kunnen gebruiken die beschikbaar zijn in het Stroom API:

@Test openbare leegte gegevenOptionalOfSome_whenToStream_thenShouldTreatItAsOneElementStream () {// gegeven Optionele waarde = Optioneel.of ("a"); // when List collect = value.stream (). map (String :: toUpperCase) .collect (Collectors.toList ()); // dan assertThat (collect) .hasSameElementsAs (List.of ("A")); }

Aan de andere kant, als Optioneel is niet aanwezig, belt de stroom() methode erop zal een lege Stroom:

@Test openbare leegte gegevenOptionalOfNone_whenToStream_thenShouldTreatItAsZeroElementStream () {// gegeven Optionele waarde = Optioneel.empty (); // when List collect = value.stream () .map (String :: toUpperCase) .collect (Collectors.toList ()); // dan assertThat (collect) .isEmpty (); }

We kunnen nu snel filteren Streams van Optioneel.

Opereren op de lege Stroom zal geen enkel effect hebben, maar dankzij de stroom() methode kunnen we nu de Optioneel API met de Stroom API. Dit stelt ons in staat om meer elegante en vloeiende code te maken.

5. Conclusie

In dit korte artikel hebben we gekeken naar de Java 9 Optioneel API-toevoegingen.

We hebben gezien hoe we de of() methode om een ​​Optioneel te retourneren in het geval dat de source Optioneel is leeg. We gebruikten de ifPresentOrElse () om het Klant als de waarde aanwezig is en anders, voer dan een andere callback uit.

Eindelijk hebben we gezien hoe we de Optioneel met de Stroom API met behulp van de stroom() methode.

De implementatie van al deze voorbeelden en codefragmenten is te vinden in het GitHub-project - dit is een Maven-project, dus het moet gemakkelijk te importeren en uit te voeren zijn zoals het is.