Como implementar o operador Elvis em Java 8?

Tenho o caso clássico "Elvis operator", onde estou a chamar métodos que podem voltar nulos e acorrentá-los juntos.
thing?:nullableMethod1(a)?:nullableMethod2(b)?:nullableMethod3()

em Java 8, a implementação mais fiel que encontrei é algo como isto:

return Optional.ofNullable(thing)
    .flatMap(x -> Optional.ofNullable(x.nullableMethod1(a)))
    .flatMap(y -> Optional.ofNullable(y.nullableMethod2(b)))
    .flatMap(z -> Optional.ofNullable(z.nullableMethod3()))
Quem me dera que Java tivesse algo parecido com a operadora do elvis.
public<U> Optional<U> elvisOperator(Function<? super T, ? extends U> mapper) {
    return flatMap(t -> Optional.ofNullable(mapper.apply(t));
}

para que eu não tivesse que embrulhar cada valor de Retorno:

return Optional.ofNullable(thing)
    .elvisOperator(x -> x.nullableMethod1(a))
    .elvisOperator(y -> y.nullableMethod2(b))
    .elvisOperator(Z::nullableMethod3); // also nice
Há uma maneira mais eficiente e idiomática de implementar o padrão do operador Elvis em Java? 8?

Author: Jacob G., 2018-09-12

1 answers

Talvez me esteja a esquecer de alguma coisa, mas há alguma razão para não poderes usar o {[[2]}?

O seguinte exemplo não imprime nada, pois Optional é curto-circuito no sentido de que, se o valor dentro do Optional não existe (é null ou o Optional está vazio), é tratado como vazio.

Optional.ofNullable("test")
        .map(s -> null)
        .ifPresent(System.out::println);
Por essa razão, pensei que podias fazer o seguinte:
return Optional.ofNullable(thing)
               .map(x -> x.nullableMethod1(a))
               .map(y -> y.nullableMethod2(b))
               .map(Z::nullableMethod3);

Isto mapearia o seu thing se existir, ou devolveria um Optional vazio caso contrário.

 12
Author: Jacob G., 2018-09-12 00:33:06