Java 9 Optionale API-Ergänzungen

Java 9 Optionale API-Ergänzungen

1. Überblick

In diesem Artikel werden wir uns die Java 9-Ergänzungen zurOptional-API ansehen.

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

2. Dieor()-Methode

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

Vor Java 9 hatte die KlasseOptionalnur die MethodenorElse() undorElseGet(), aber beide müssen nicht umschlossene Werte zurückgeben.

Java 9 führt die Methodeor() ein, die träge ein weiteresOptional zurückgibt, wenn unserOptional leer ist. Wenn unser erstesOptional einen definierten Wert hat, wird das an dieor()-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);
}

WennOptional being leer ist, sind die zurückgegebenenresult die gleichen wie diedefaultValue:

@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. DieifPresentOrElse()-Methode

Wenn wir eineOptional-Instanz haben, möchten wir häufig eine bestimmte Aktion für den zugrunde liegenden Wert ausführen. Wenn andererseitsOptionalempty ist, möchten wir es protokollieren oder diese Tatsache durch Inkrementieren einer Metrik verfolgen.

Die MethodeifPresentOrElse()wird genau für solche Szenarien erstellt. Wir könnenConsumer übergeben, die aufgerufen werden, wennOptional definiert ist, undRunnable, die ausgeführt werden, wennOptional leer ist.

Nehmen wir an, wir haben ein definiertesOptional 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 Callback nicht ausgeführt wurde.

Bei einem leerenOptional, 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. Diestream()-Methode

Die letzte Methode, die derOptional-Klasse in Java 9 hinzugefügt wird, ist diestream()-Methode.

Java verfügt über eine sehr fließende und eleganteStream-API, die mit den Sammlungen arbeiten kann und viele funktionale Programmierkonzepte verwendet. Die neueste Java-Version führt diestream()-Methode für dieOptional-Klasseallows us to treat the Optional instance as a Stream. ein

Nehmen wir an, wir haben ein definiertesOptional und rufen diestream()-Methode darauf auf. Dadurch wird einStream eines Elements erstellt, für das wir alle Methoden verwenden können, die in derStream API: verfügbar sind

@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 andererseitsOptional nicht vorhanden ist, wird durch Aufrufen derstream()-Methode ein leeresStream: 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 schnellStreams of Optionals. filtern

Das Arbeiten mit den leerenStream hat keine Auswirkung, aber dank derstream()-Methode können wir jetzt dieOptional-API mit derStream-API verketten. Auf diese Weise können wir eleganteren und flüssigeren Code erstellen.

5. Fazit

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

Wir haben gesehen, wie die Methodeor() verwendet wird, um eine Option zurückzugeben, falls die QuelleOptional leer ist. Wir habenifPresentOrElse() verwendet, umConsumer auszuführen, wenn der Wert vorhanden ist, und andernfalls den anderen Rückruf auszuführen.

Schließlich haben wir gesehen, wie dieOptional mit derStream-API unter Verwendung derstream()-Methode verkettet werden.

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