Optional oderElse Optional

Optional oderElse Optional

1. Einführung

In einigen Fällen möchten wir möglicherweise auf die Instanz eines anderenOptionalzurückgreifen, wenn eine andere leer ist.

In diesem Tutorial werden wir kurz erwähnen, wie wir das tun können - was schwieriger ist, als es aussieht.

Eine Einführung in die Java Optional-Klasse finden Sie in unserenprevious article.

2. Verwenden von Plain Java

In Java 8 gibt es keine direkte Möglichkeit, eine andereOptional zurückzugeben, wenn die erste leer ist.

Daher können wir unsere eigene benutzerdefinierte Methode implementieren:

public static  Optional or(Optional optional, Optional fallback) {
    return optional.isPresent() ? optional : fallback;
}

Und in der Praxis:

@Test
public void givenOptional_whenValue_thenOptionalGeneralMethod() {
    String name = "Filan Fisteku";
    String missingOptional = "Name not provided";
    Optional optionalString = Optional.ofNullable(name);
    Optional fallbackOptionalString = Optional.ofNullable(missingOptional);

    assertEquals(
      optionalString,
      Optionals.or(optionalString, fallbackOptionalString));
}

@Test
public void givenEmptyOptional_whenValue_thenOptionalGeneralMethod() {
    Optional optionalString = Optional.empty();
    Optional fallbackOptionalString = Optional.ofNullable("Name not provided");

    assertEquals(
      fallbackOptionalString,
      Optionals.or(optionalString, fallbackOptionalString));
}

Andererseits istJava 9 does add an or() method that we can use to get an Optional, or another value, if that Optional isn’t present.

Lassen Sie uns dies in der Praxis anhand eines kurzen Beispiels sehen:

public static Optional getName(Optional name) {
    return name.or(() -> getCustomMessage());
}

Wir haben eine Hilfsmethode verwendet, um uns bei unserem Beispiel zu helfen:

private static Optional getCustomMessage() {
    return Optional.of("Name not provided");
}

Wir können es testen und besser verstehen, wie es funktioniert. Der folgende Testfall ist eine Demonstration des Falls, in demOptional einen Wert hat:

@Test
public void givenOptional_whenValue_thenOptional() {
    String name = "Filan Fisteku";
    Optional optionalString = Optional.ofNullable(name);
    assertEquals(optionalString, Optionals.getName(optionalString));
}

3. Mit Guave

Eine andere Möglichkeit, dies zu tun, ist die Verwendung deror() -Methode derOptional -Skala der Guave. Zuerst müssen wirguava in zu unserem Projekt hinzufügen (die neueste Version finden Sie unterhere):


    com.google.guava
    guava
    24.1.1-jre

Jetzt können wir mit demselben Beispiel fortfahren, das wir zuvor hatten:

public static com.google.common.base.Optional getOptionalGuavaName(com.google.common.base.Optional name) {
    return name.or(getCustomMessageGuava());
}
private static com.google.common.base.Optional getCustomMessageGuava() {
    return com.google.common.base.Optional.of("Name not provided");
}

Wie wir sehen können, ist es dem oben gezeigten sehr ähnlich. Es hat jedoch einen kleinen Unterschied in der Benennung der Methode und ist genau das gleiche wieor() method der KlasseOptional aus JDK 9.

Wir können es jetzt testen, ähnlich wie im obigen Beispiel:

@Test
public void givenGuavaOptional_whenInvoke_thenOptional() {
    String name = "Filan Fisteku";
    Optional stringOptional = Optional.of(name);

    assertEquals(name, Optionals.getOptionalGuavaName(stringOptional));
}
@Test
public void givenGuavaOptional_whenNull_thenDefaultText() {
    assertEquals(
      com.google.common.base.Optional.of("Name not provided"),
      Optionals.getOptionalGuavaName(com.google.common.base.Optional.fromNullable(null)));
}

4. Fazit

Dies war ein kurzer Artikel, der zeigte, wie die Funktionalität vonOptional orElse Optionalerreicht wird.

Der Code für alle hier erläuterten Beispiele und vieles mehr finden Sie inover on GitHub.