Comment implémenter l'opérateur Elvis en Java 8?
J'ai le cas classique "Elvis operator" , où j'appelle des méthodes qui peuvent renvoyer null et les enchaîner ensemble:
thing?:nullableMethod1(a)?:nullableMethod2(b)?:nullableMethod3()
En Java 8, l'implémentation la plus fidèle que j'ai trouvée est quelque chose comme ceci:
return Optional.ofNullable(thing)
.flatMap(x -> Optional.ofNullable(x.nullableMethod1(a)))
.flatMap(y -> Optional.ofNullable(y.nullableMethod2(b)))
.flatMap(z -> Optional.ofNullable(z.nullableMethod3()))
Je souhaite que Java Optional
ait quelque chose de semblable à l'opérateur Elvis:
public<U> Optional<U> elvisOperator(Function<? super T, ? extends U> mapper) {
return flatMap(t -> Optional.ofNullable(mapper.apply(t));
}
Pour que je n'aie pas à envelopper chaque valeur de retour:
return Optional.ofNullable(thing)
.elvisOperator(x -> x.nullableMethod1(a))
.elvisOperator(y -> y.nullableMethod2(b))
.elvisOperator(Z::nullableMethod3); // also nice
Existe-t-il un moyen plus efficace et idiomatique d'implémenter le modèle d'opérateur Elvis en Java 8?
1 answers
Peut-être que je néglige quelque chose, mais y a-t-il une raison pour laquelle vous ne pouvez pas utiliser Optional#map
?
L'exemple suivant n'imprime rien, car Optional
est court-circuitant dans le sens où, si la valeur à l'intérieur du Optional
n'existe pas (c'est null
ou le Optional
est vide), il est traité comme vide.
Optional.ofNullable("test")
.map(s -> null)
.ifPresent(System.out::println);
Pour cette raison, je pense que vous pourriez simplement faire ce qui suit:
return Optional.ofNullable(thing)
.map(x -> x.nullableMethod1(a))
.map(y -> y.nullableMethod2(b))
.map(Z::nullableMethod3);
Cela mapperait votre thing
s'il existe, ou retournerait un Optional
vide sinon.