Style fonctionnel de Java 8 est Facultatif.ifPresent et si n'est pas Présent?

Dans Java 8, je veux faire quelque chose à un Optional objet, si elle est présente, et faire autre chose si elle n'est pas présente.

if (opt.isPresent()) {
  System.out.println("found");
} else {
  System.out.println("Not found");
}

Ce n'est pas un "style fonctionnel", bien.

Optional a un ifPresent() méthode, mais je suis incapable de chaîne d'une orElse() méthode.

Donc, je ne peux pas écrire:

opt.ifPresent( x -> System.out.println("found " + x))
   .orElse( System.out.println("NOT FOUND"));

En réponse à @assylias, je ne pense pas que Optional.map() travaille pour le cas suivant:

opt.map( o -> {
  System.out.println("while opt is present...");
  o.setProperty(xxx);
  dao.update(o);
  return null;
}).orElseGet( () -> {
  System.out.println("create new obj");
  dao.save(new obj);
  return null;
});

Dans ce cas, lorsque opt est présent, je l'ai mise à jour de ses biens et de les enregistrer dans la base de données. Quand il n'est pas disponible, j'ai créer un nouveau obj et de les enregistrer dans la base de données.

Remarque dans les deux lambdas j'ai du renvoyer null.

Mais quand opt est présent, les deux lambdas sera exécuté. obj sera mis à jour, et un nouvel objet sera enregistré dans la base de données . C'est à cause de la return null dans la première lambda. Et orElseGet() continuera à exécuter.

  • orElse est destiné à quelque chose de différent.
  • Oui , je sais . Je veux juste quelque chose comme ça.
  • Utilisez votre premier échantillon. Il est beau.
  • Je vous suggère d'arrêter de forcer certains comportements lors de l'utilisation d'une API qui n'est pas conçu pour que les comportements. Vous rfirst exemple semble bien pour moi en dehors de quelques petites style de commentaires, mais ceux-ci sont opiniated.
  • System.out.println( (opt.isPresent()? "" : "Not ") + "found");
  • remplacer return null; avec return o; (les deux). Cependant, j'ai le fort sentiment que vous travaillez à la mauvaise place. Vous devez travailler sur le site, qui a produit que Optional. À cet endroit il y aurait lieu d'effectuer l'opération souhaitée sans l'intermédiaire Optional.
  • Java 9 met en œuvre une solution à votre problème: iteratrlearning.com/java9/2016/09/05/java9-optional.html
  • Je pense que la raison pour laquelle cela ne peut être fait facilement est sur le but. En option ne devrait pas faire de contrôle de flux, mais plutôt la transformation de la valeur. Je sais que le ifPresent contredit cela. Toutes les autres méthodes font référence à la valeur et non pas des actions.
  • Je dirais que votre deuxième exemple, qui utilise map, est encore moins fonctionnelle que la ifPresent version. En programmation fonctionnelle, les fonctions ne doit pas produire des effets secondaires tels que l'impression et la modification d'autres valeurs. Ils ne peuvent le faire les calculs. - Je éviter d'utiliser map tout moment, je suis en train de produire des effets secondaires. En voyant map appelé, il est naturel de supposer qu'il n'y aura pas d'effets secondaires, seulement une transformation de la valeur, car il est fonctionnel arrière-plan. À l'aide de la manière que le suggère son nom, est une beaucoup plus de manière sémantique du programme.
  • Aussi, je ne suis pas sûr en Java, mais dans de nombreuses langues telles que la Rouille et Haskell, map est un paresseux opération en ce sens qu'elle ne sera pas réellement appeler le bloc que vous passer jusqu'à ce que vous essayez d'utiliser ou de vérifier la valeur de l'option. Donc, en fonction de la langue, une telle déclaration ne peut jamais être exécuté, et comme un résultat optimiser loin. Cela peut ne pas s'appliquer à Java, mais c'est quelque chose d'important à connaître.

InformationsquelleAutor smallufo | 2014-05-21