Java 9 Optionale API-Ergänzungen

1. Übersicht

In diesem Artikel werden die Java 9-Ergänzungen zur optionalen API beschrieben.

Über die Modularität hinaus fügt Java 9 drei sehr nützliche Methoden für die optionale Klasse hinzu.

2. Die oder () Methode

Manchmal, wenn unsere Option leer ist, möchten wir eine andere Aktion ausführen, die ebenfalls eine Option zurückgibt.

Vor Java 9 hatte die optionale Klasse nur die Methoden orElse () und orElseGet () , aber beide müssen nicht umschlossene Werte zurückgeben.

Java 9 führt die Methode or () ein , die träge eine andere Option zurückgibt, wenn unsere Option leer ist. Wenn unsere erste Option einen definierten Wert hat, wird das an die Methode (() übergebene Lambda nicht aufgerufen und der Wert wird nicht berechnet und zurückgegeben:

@Test public void givenOptional_whenPresent_thenShouldTakeAValueFromIt() { //given String expected = "properValue"; Optional value = Optional.of(expected); Optional defaultValue = Optional.of("default"); //when Optional result = value.or(() -> defaultValue); //then assertThat(result.get()).isEqualTo(expected); }

Im Fall von Optional bei ng leer entspricht das zurückgegebene Ergebnis dem defaultValue:

@Test public void givenOptional_whenEmpty_thenShouldTakeAValueFromOr() { // given String defaultString = "default"; Optional value = Optional.empty(); Optional defaultValue = Optional.of(defaultString); // when Optional result = value.or(() -> defaultValue); // then assertThat(result.get()).isEqualTo(defaultString); }

3. Die ifPresentOrElse () Methode

Wenn wir eine optionale Instanz haben, möchten wir häufig eine bestimmte Aktion für den zugrunde liegenden Wert ausführen. Wenn die Option jedoch leer ist , möchten wir sie protokollieren oder diese Tatsache durch Inkrementieren einer Metrik verfolgen.

Die ifPresentOrElse () -Methode wird genau für solche Szenarien erstellt. Wir können einen Consumer übergeben , der aufgerufen wird, wenn die Option definiert ist, und Runnable , der ausgeführt wird, wenn die Option leer ist.

Angenommen, wir haben eine definierte Option und möchten einen bestimmten Zähler erhöhen, wenn der Wert vorhanden ist:

@Test public void givenOptional_whenPresent_thenShouldExecuteProperCallback() { // given Optional value = Optional.of("properValue"); AtomicInteger successCounter = new AtomicInteger(0); AtomicInteger onEmptyOptionalCounter = new AtomicInteger(0); // when value.ifPresentOrElse( v -> successCounter.incrementAndGet(), onEmptyOptionalCounter::incrementAndGet); // then assertThat(successCounter.get()).isEqualTo(1); assertThat(onEmptyOptionalCounter.get()).isEqualTo(0); }

Beachten Sie, dass der als zweites Argument übergebene Rückruf nicht ausgeführt wurde.

Im Falle eines leeren optionalen wird der zweite Rückruf ausgeführt:

@Test public void givenOptional_whenNotPresent_thenShouldExecuteProperCallback() { // given Optional value = Optional.empty(); AtomicInteger successCounter = new AtomicInteger(0); AtomicInteger onEmptyOptionalCounter = new AtomicInteger(0); // when value.ifPresentOrElse( v -> successCounter.incrementAndGet(), onEmptyOptionalCounter::incrementAndGet); // then assertThat(successCounter.get()).isEqualTo(0); assertThat(onEmptyOptionalCounter.get()).isEqualTo(1); }

4. Die stream () -Methode

Die letzte Methode, die der optionalen Klasse in Java 9 hinzugefügt wird , ist die stream () -Methode.

Java verfügt über eine sehr flüssige und elegante Stream- API, die die Sammlungen verarbeiten kann und viele funktionale Programmierkonzepte verwendet. Die neueste Java-Version führt die stream () -Methode für die Option- Klasse ein, mit der wir die Optionale Instanz als Stream behandeln können.

Angenommen, wir haben eine definierte Option und rufen die stream () -Methode auf. Dadurch wird ein Stream aus einem Element erstellt, für den wir alle in der Stream- API verfügbaren Methoden verwenden können :

@Test public void givenOptionalOfSome_whenToStream_thenShouldTreatItAsOneElementStream() { // given Optional value = Optional.of("a"); // when List collect = value.stream().map(String::toUpperCase).collect(Collectors.toList()); // then assertThat(collect).hasSameElementsAs(List.of("A")); }

Wenn Optional nicht vorhanden ist, wird durch Aufrufen der stream () -Methode ein leerer Stream erstellt:

@Test public void givenOptionalOfNone_whenToStream_thenShouldTreatItAsZeroElementStream() { // given Optional value = Optional.empty(); // when List collect = value.stream() .map(String::toUpperCase) .collect(Collectors.toList()); // then assertThat(collect).isEmpty(); }

Wir können jetzt Streams of Optionals schnell filtern .

Das Arbeiten mit dem leeren Stream hat keine Auswirkungen, aber dank der stream () -Methode können wir jetzt die optionale API mit der Stream- API verketten. Auf diese Weise können wir eleganteren und flüssigeren Code erstellen.

5. Schlussfolgerung

In diesem kurzen Artikel haben wir uns die optionalen Java 9- API-Ergänzungen angesehen.

Wir haben gesehen, wie die or () -Methode verwendet wird, um ein Optional zurückzugeben, falls die Quelle Optional leer ist. Wir haben ifPresentOrElse () verwendet , um den Consumer auszuführen, wenn der Wert vorhanden ist, und andernfalls den anderen Rückruf auszuführen .

Schließlich haben wir gesehen, wie das Optionale mit der Stream- API mithilfe der stream () -Methode verkettet wird.

Die Implementierung all dieser Beispiele und Codefragmente finden Sie im GitHub-Projekt - dies ist ein Maven-Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.