Opcional ou outro opcional
1. Introdução
Em alguns casos, podemos querer retroceder para outra instânciaOptional se outra estiver vazia.
Neste tutorial, vamos mencionar brevemente como podemos fazer isso - o que é mais difícil do que parece.
Para uma introdução à classe Java opcional, dê uma olhada em nossoprevious article.
2. Usando Plain Java
No Java 8, não há uma maneira direta de obter um retornoOptional diferente se o primeiro estiver vazio.
Portanto, podemos implementar nosso próprio método personalizado:
public static Optional or(Optional optional, Optional fallback) {
return optional.isPresent() ? optional : fallback;
}
E, na prática:
@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));
}
Por outro lado,Java 9 does add an or() method that we can use to get an Optional, or another value, if that Optional isn’t present.
Vamos ver isso na prática com um exemplo rápido:
public static Optional getName(Optional name) {
return name.or(() -> getCustomMessage());
}
Usamos um método auxiliar para nos ajudar com nosso exemplo:
private static Optional getCustomMessage() {
return Optional.of("Name not provided");
}
Podemos testá-lo e entender melhor como está funcionando. O seguinte caso de teste é uma demonstração do caso em queOptional tem um valor:
@Test
public void givenOptional_whenValue_thenOptional() {
String name = "Filan Fisteku";
Optional optionalString = Optional.ofNullable(name);
assertEquals(optionalString, Optionals.getName(optionalString));
}
3. Usando goiaba
Outra maneira de fazer isso é usando o métodoor() do sclassOptional da goiaba. Primeiro, precisamos adicionarguava in nosso projeto (a versão mais recente pode ser encontradahere):
com.google.guava
guava
24.1.1-jre
Agora, podemos continuar com o mesmo exemplo que tivemos anteriormente:
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");
}
Como podemos ver, é muito semelhante ao exibido acima. No entanto, há uma pequena diferença na nomenclatura do método e é exatamente o mesmo queor() method da classeOptional do JDK 9.
Agora podemos testá-lo, da mesma forma que o exemplo acima:
@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. Conclusão
Este foi um artigo rápido que ilustra como obter a funcionalidadeOptional orElse Optional.
O código para todos os exemplos explicados aqui e muito mais pode ser encontradoover on GitHub.