NullPointerException rencontrée dans Collectors.toMap avec des valeurs d'entrée nulles
Introduction
Dans Java 8 , Collectors.toMap est une méthode pratique pour créer une carte à partir d'un flux de paires clé-valeur. Cependant, cette méthode renvoie une NullPointerException si l'une des valeurs du flux est nulle. Cela semble étrange, étant donné que les cartes peuvent contenir des valeurs nulles sans aucun problème.
Raison de l'exception nulle
La raison derrière ce comportement est l'implémentation par défaut des collecteurs. toMap utilise un HashMap comme structure de données sous-jacente. Les HashMaps n'autorisent pas les valeurs nulles pour les clés, mais ils autorisent les valeurs nulles pour les valeurs. Cependant, lorsque Collectors.toMap rencontre une valeur nulle pour une clé, il tente d'utiliser la valeur par défaut pour la valeur (qui est nulle), ce qui entraîne l'exception NullPointerException.
Solution Java 8
Pour résoudre ce problème dans Java 8, nous pouvons utiliser une solution de contournement qui consiste à créer manuellement un HashMap et à le remplir avec les paires clé-valeur du stream:
Map<Integer, Boolean> collect = list.stream() .collect(HashMap::new, (m,v)->m.put(v.getId(), v.getAnswer()), HashMap::putAll);
Cette solution de contournement n'est pas particulièrement élégante, mais elle produira le résultat attendu : une carte contenant les paires clé-valeur du flux, avec des valeurs nulles pour toutes les clés qui avaient des valeurs nulles dans le stream.
Considérations
Il est important de noter que cette solution de contournement a les éléments suivants considérations :
Si ces considérations sont inacceptables pour votre cas d'utilisation, vous devrez peut-être envisager des approches alternatives, telles que l'utilisation une implémentation différente du Collector ou un retour à une ancienne boucle for.
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!