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?
11
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