Необязательно или Else Необязательно

Необязательный orElse Необязательный

1. Вступление

В некоторых случаях мы можем захотеть вернуться к другому экземпляруOptional, если другой пуст.

В этом руководстве мы кратко расскажем, как это сделать - что сложнее, чем кажется.

Для введения в необязательный класс Java взгляните на нашprevious article.

2. Использование простой Java

В Java 8 нет прямого способа добиться возврата другогоOptional, если первый пуст.

Поэтому мы можем реализовать наш собственный метод:

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

И на практике:

@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));
}

С другой стороны,Java 9 does add an or() method that we can use to get an Optional, or another value, if that Optional isn’t present.

Давайте посмотрим на это на практике на небольшом примере:

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

В нашем примере мы использовали вспомогательный метод:

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

Мы можем протестировать его и понять, как он работает. Следующий тестовый пример демонстрирует случай, когдаOptional ha имеет значение:

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

3. Использование гуавы

Другой способ сделать это - использовать методor()  классаOptional гуавы. Во-первых, нам нужно добавитьguava in в наш проект (последнюю версию можно найтиhere):


    com.google.guava
    guava
    24.1.1-jre

Теперь мы можем продолжить с тем же примером, что и раньше:

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");
}

Как мы видим, он очень похож на показанный выше. Однако он имеет небольшое отличие в названии метода и в точности совпадает с методомor()  классаOptional из JDK 9.

Теперь мы можем проверить это, как в примере выше:

@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. Заключение

Это была краткая статья, показывающая, как добиться функциональностиOptional orElse Optional.

Код для всех описанных здесь примеров и многое другое можно найти вover on GitHub.