Необязательный 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.