Heim  >  Artikel  >  Java  >  Warum löst Collectors.toMap eine NullPointerException mit Null-Eintragswerten aus?

Warum löst Collectors.toMap eine NullPointerException mit Null-Eintragswerten aus?

Linda Hamilton
Linda HamiltonOriginal
2024-11-11 21:44:03396Durchsuche

Why Does Collectors.toMap Throw a NullPointerException with Null Entry Values?

NullPointerException in Collectors.toMap mit Null-Eintragswerten aufgetreten

Einführung

In Java 8 Collectors.toMap ist eine praktische Methode zum Erstellen einer Map aus einem Strom von Schlüssel-Wert-Paaren. Diese Methode löst jedoch eine NullPointerException aus, wenn einer der Werte im Stream null ist. Das erscheint seltsam, wenn man bedenkt, dass Maps ohne Probleme Nullwerte enthalten können.

Grund für Null-Ausnahme

Der Grund für dieses Verhalten ist, dass die Standardimplementierung von Collectors. toMap verwendet eine HashMap als zugrunde liegende Datenstruktur. HashMaps erlauben keine Nullwerte für Schlüssel, aber sie erlauben Nullwerte für Werte. Wenn Collectors.toMap jedoch auf einen Nullwert für einen Schlüssel stößt, versucht es, den Standardwert für den Wert zu verwenden (der null ist), und dies führt zur NullPointerException.

Java 8-Lösung

Um dieses Problem in Java 8 zu beheben, können wir eine Problemumgehung verwenden, bei der manuell eine HashMap erstellt und diese mit den Schlüssel-Wert-Paaren aus dem Stream gefüllt wird:

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

Dies Die Problemumgehung ist nicht besonders elegant, führt aber zum erwarteten Ergebnis: eine Map mit den Schlüssel-Wert-Paaren aus dem Stream, mit Nullwerten für alle Schlüssel, die im Stream Nullwerte hatten.

Überlegungen

Es ist wichtig zu beachten, dass diese Problemumgehung die folgenden Überlegungen beinhaltet:

  • Im Gegensatz zu Collectors.toMap werden Werte stillschweigend ersetzt, wenn Sie denselben Schlüssel mehrmals haben.
  • Es verwendet eine HashMap als zugrunde liegende Datenstruktur, die möglicherweise nicht für alle Szenarien geeignet ist.

Wenn diese Überlegungen für Ihren Anwendungsfall nicht akzeptabel sind, müssen Sie möglicherweise eine Alternative in Betracht ziehen Ansätze, wie die Verwendung einer anderen Collector-Implementierung oder die Rückkehr zu einer einfachen alten for-Schleife.

Das obige ist der detaillierte Inhalt vonWarum löst Collectors.toMap eine NullPointerException mit Null-Eintragswerten aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn