8
votes

Comment convertir la méthode suivante en java 8?

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?


2 commentaires

@manfromnowhere il est voulu 'orElse' part.


Il est recommandé d'utiliser orElse


4 Réponses :


9
votes

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'


6 commentaires

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 basePrescription = container! = null? container.stream (). findFirst (). map (DD :: getPrescription) .orEl‌ se (null): null; 'y a-t-il un moyen de simplifier davantage cela?


@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 basePrescription = container! = null? container.stream (). findFirst (). map (DD :: getPrescription) .orEl‌ se (null): null; ' dans ce code, si le conteneur n'est pas nul, mais que se passe-t-il est-il vide?


@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 .



5
votes

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();


1 commentaires

Ils ne sont pas fonctionnels. container.isEmpty () lancera. Mais j'ai supposé qu'OP savait comment faire des vérifications nulles.



4
votes

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 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.


0 commentaires

1
votes
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

0 commentaires