Maison  >  Article  >  Java  >  Pourquoi Collectors.toMap lance-t-il une exception NullPointerException pour les valeurs nulles ?

Pourquoi Collectors.toMap lance-t-il une exception NullPointerException pour les valeurs nulles ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-11 13:44:03200parcourir

Why Does Collectors.toMap Throw a NullPointerException for Null Values?

Valeurs nulles dans Collectors.toMap : une explication et des solutions Java 8

La méthode Collectors.toMap de Java 8 renvoie une NullPointerException lorsqu'elle rencontre null valeurs comme deuxième argument, malgré les cartes autorisant des valeurs nulles comme valeurs. Ce comportement particulier a semé la confusion parmi les développeurs.

Raison derrière le comportement

La raison sous-jacente de ce comportement est un bug connu dans l'implémentation OpenJDK de Collectors.toMap. La méthode tente de fusionner les valeurs actuelles et nouvelles pour une clé donnée à l'aide de l'opération HashMap.merge. Cependant, cette opération ne gère pas correctement les valeurs nulles, ce qui entraîne l'exception.

Solution Java 8

Pour contourner ce problème, vous pouvez utiliser l'approche suivante :

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

Ce code crée un nouveau HashMap et utilise un collecteur personnalisé pour le remplir en appelant directement la méthode put. Cette approche permet d'ajouter des valeurs nulles.

Autres considérations

Contrairement à Collectors.toMap, la solution fournie remplacera silencieusement les valeurs si la même clé apparaît plusieurs fois. Si cela n'est pas souhaité, vous pouvez envisager des solutions alternatives proposées dans la section commentaires.

En comprenant la raison derrière l'exception NullPointerException et en utilisant la solution de contournement, vous pouvez gérer efficacement les valeurs nulles lors de l'utilisation de Collectors.toMap.

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