Quelle est la façon la plus élégante de combiner les options?

Voici ce que j'ai obtenu jusqu'à présent:

Optional<Foo> firstChoice = firstChoice();
Optional<Foo> secondChoice = secondChoice();
return Optional.ofNullable(firstChoice.orElse(secondChoice.orElse(null)));

Cela me semble à la fois hideux et de gaspillage. Si firstChoice est présent, je suis inutilement de l'informatique secondChoice.

Il y a également une plus efficace version:

Optional<Foo> firstChoice = firstChoice();
if(firstChoice.isPresent()) {
 return firstChoice;
} else {
 return secondChoice();
}

Ici je ne peux pas la chaîne certaine fonction de mappage à la fin, sans dupliquer le mappeur ou la déclaration d'une autre variable locale. Tout cela rend le code plus compliqué que le réel problème étant résolu.

Je préfère être écrit ceci:

return firstChoice().alternatively(secondChoice());

Cependant Facultatif::sinon, évidemment, n'existe pas. Maintenant ce qui?

  • double possible de Obtenir la valeur d'une Option ou d'une autre
  • ... lorsque l'on est confronté avec le problème de la valeur null, " maintenant, nous avons deux problèmes.
  • Btw, Paul Sandoz vient de publier un changeset pour l'examen qui introduit Optional.or() méthode, qui fait exactement ce que vous voulez: firstChoice().or(this::secondChoice). Plus d'infos sur JDK-8080418. En Java-9 fois nous allons être heureux!