Opcional ou outro opcional

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.