J'ai un objet List et je dois prendre le premier élément de la liste s'il n'est pas nul ou vide.
J'écris ci-dessous le code en utilisant java et maintenant je veux le convertir en Java 8.
DD detail = container.stream().findFirst().get();
Je le convertis comme ça.
List<DD> container A<DD,DI> a; if(container!=null || !container.isEmpty()){ for(DD dd:container) { a = dd.getPrescription(); break; } }
J'ai besoin de savoir que c'est correct?
4 Réponses :
Il y a une faille critique dans votre code actuel, c'est-à-dire
A<DD, DI> basePrescription = Stream.ofNullable(container) // Java-9 API .flatMap(List::stream) .findFirst() .map(DD::getPrescription) .orElse(null);
cela peut toujours lancer une NullPointerException
(quand >), sauf si l'opérateur conditionnel est changé en &&
. Postez quelle implémentation ci-dessous serait ce que je suggérerais de suivre.
C'est presque correct, dans le sens où vous devez gérer une valeur par défaut si les conditions ne sont pas remplies:
XXX
Si le conteneur
lui-même peut être nul, utilisez
container.stream().findFirst().map(DD::getPrescription).orElse(null) // ^^ // return type of prescription then
Dans le cas où vous avez besoin la prescription de cet objet, utilisez map
comme:
DD detail = container != null ? container.stream().findFirst().orElse(null) : null;
Avec Java-9, cela aurait pu être beaucoup plus simple que: p>
DD detail = container.stream().findFirst().orElse(null); // or some default value instead of 'null'
container
peut être nul selon le code d'origine de l'OP. Vous voudrez peut-être changer cela en detail = container! = Null? container.stream (). findFirst (). orElse (
ou effectuez une vérification régulière des null
si je comprends bien 'container! = null || ! container.isEmpty () 'cette condition, est-ce le code ci-dessus?
@nullpointer je décide d'écrire comme ceci 'A
@uma pas grand chose auquel je pourrais penser actuellement avec Java-8 et ces possibilités de null
. Modifié pour inclure également une solution java-9 plus propre.
@nullpointer '' A
@uma Si elle est vide, la branche à suivre serait container.stream () ...
aucun élément donc findFirst
renvoie Optional.empty
et donc orElse (null)
entre en scène .. en bref il renverrait null
.
C'est beaucoup plus simple:
A<DD,DI> a = container != null && !container.isEmpty() ? container.get(0).getPrescription() : null;
Bien qu'il s'agisse d'une traduction directe de votre code d'origine, vous avez probablement voulu quelque chose comme ça:
A<DD,DI> a = container.get(0).getPrescription();
Ils ne sont pas fonctionnels. container.isEmpty ()
lancera. Mais j'ai supposé qu'OP savait comment faire des vérifications nulles.
Depuis JDK9, il existe une nouvelle méthode T requireNonNullElse (T obj, T defaultObj) qui retourne essentiellement le premier argument s'il est non nul et renvoie autrement le second argument non nul.
Nous pouvons donc simplifier votre code en:
Objects.requireNonNullElse(container, Collections.emptyList()) .stream() .findFirst() .map(DD::getPrescription);
Cela renvoie un Facultatif
où T
est le type de getPrescription
. selon le contexte et si cela est approprié, vous pouvez utiliser .orElse (null);
pour obtenir la valeur que contient l'option facultative ou bien une valeur null
mais il y en a aussi plusieurs d'autres méthodes dans Facultatif
API que vous pourriez trouver plus utile lors de l'extraction de la valeur de l'option.
The findFirst() method finds the first element in a Stream. This method is used when you specifically want the first element from a sequence. a) container.stream().findFirst().orElse(null); b) container.stream().filter(Objects::nonNull).findFirst().orElse(null); c)container.stream().filter(StringUtils::isNotBlank).findFirst(); or as lambdas: d)container.stream().filter(s -> StringUtils.isNotBlank(s)).findFirst(); e)container.stream().filter(StringUtils::isNotBlank).findFirst() For reference:- http://www.geekabyte.io/2015/01/using-optional-effectively-in-java-8.html
@manfromnowhere il est voulu 'orElse' part.
Il est recommandé d'utiliser orElse