Maison  >  Article  >  Java  >  Pourquoi Collectors.toMap lève-t-il une exception NullPointerException lorsque les valeurs sont nulles ?

Pourquoi Collectors.toMap lève-t-il une exception NullPointerException lorsque les valeurs sont nulles ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-10 15:32:03478parcourir

Why Does Collectors.toMap Throw a NullPointerException When Values Are Null?

NullPointerException dans Collectors.toMap avec des valeurs d'entrée nulles

Collectors.toMap renvoie une NullPointerException lorsqu'une des valeurs est nulle. Ce comportement est surprenant car les cartes peuvent contenir des valeurs nulles sans aucun problème. Pourquoi cette restriction est-elle en place pour Collectors.toMap ?

La raison de cette restriction est que Collectors.toMap utilise un HashMap en interne. Les HashMaps n'autorisent pas les valeurs nulles pour les clés, mais ils autorisent les valeurs nulles pour les valeurs. Cependant, Collectors.toMap suppose que toutes les valeurs ne sont pas nulles et lève une NullPointerException si cette hypothèse n'est pas respectée.

Java 8 ne fournit pas un moyen efficace de résoudre ce problème. Vous pouvez soit revenir à une ancienne boucle for, soit utiliser une solution de contournement comme celle ci-dessous :

Map<Integer, Boolean> collect = list.stream()
        .collect(HashMap::new, (m,v)->m.put(v.getId(), v.getAnswer()), HashMap::putAll);

Cette solution de contournement utilise un constructeur HashMap qui prend un fournisseur comme argument. Le fournisseur est utilisé pour créer une nouvelle instance de carte si le flux est vide. Dans ce cas, le fournisseur crée un nouveau HashMap avec une capacité par défaut de 16 et un facteur de charge de 0,75.

La solution de contournement utilise ensuite la méthode putAll pour ajouter tous les éléments du flux à la carte. La méthode putAll fusionne les éléments du flux dans la carte, en remplaçant tous les éléments existants par la même clé.

Cette solution de contournement n'est pas aussi simple que la méthode Collectors.toMap, mais elle fonctionne. Il préserve également l'ordre des éléments dans le flux, ce que Collectors.toMap ne fait pas.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn