109 votes

Comment gérer les flux jdk8 pour les valeurs nulles ?

Je sais que le sujet peut être un peu in advance comme le JDK8 n'est pas encore sorti (et pas pour l'instant en tout cas ) mais je lisais quelques articles sur les expressions Lambda et particulièrement la partie liée à la nouvelle API de collecte connue sous le nom de Stream.

Voici l'exemple tel qu'il est donné dans le Article du magazine Java (c'est un algorithme de la population des loutres..) :

Set<Otter> otters = getOtters();
System.out.println(otters.stream()
    .filter(o -> !o.isWild())
    .map(o -> o.getKeeper())
    .filter(k -> k.isFemale())
    .into(new ArrayList<>())
    .size());

Ma question est la suivante : que se passe-t-il si, au milieu de l'itération interne Set, l'une des loutres est nulle ?

Je m'attendrais à ce qu'une exception NullPointerException soit levée mais peut-être suis-je encore coincé dans le paradigme de développement précédent (non fonctionnel), quelqu'un peut-il m'éclairer sur la façon dont cela devrait être traité ?

Si cela déclenche réellement une exception NullPointerException, je trouve cette fonctionnalité assez dangereuse et il faudra l'utiliser uniquement comme ci-dessous :

  • Développeur pour s'assurer qu'il n'y a pas de valeur nulle (peut-être en utilisant un précédent . .filter(o -> o != null))
  • Développeur pour s'assurer que l'application n'est jamais générer de null otter ou un objet spécial NullOtter à traiter.

Quelle est la meilleure option, ou toute autre option ?

1voto

smilyface Points 122

Si vous ne voulez pas itérer deux fois (filtre + carte ou autre). Essayez ceci.

private static void trimAll() {
    String[] emtLne = {"", " ", "  cc  ", null, "      xx   "};
    System.out.println(Arrays.stream(emtLne).map(val -> (val != null) ? val.trim() : "").collect(Collectors.joining()));
}

Sortie
ccxx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X