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