Collectors.toMap löst eine NullPointerException aus, wenn einer der Werte null ist. Dieses Verhalten ist überraschend, da Karten problemlos Nullwerte enthalten können. Warum gilt diese Einschränkung für Collectors.toMap?
Der Grund für diese Einschränkung ist, dass Collectors.toMap intern eine HashMap verwendet. HashMaps erlauben keine Nullwerte für Schlüssel, aber sie erlauben Nullwerte für Werte. Collectors.toMap geht jedoch davon aus, dass alle Werte ungleich Null sind, und löst eine NullPointerException aus, wenn diese Annahme verletzt wird.
Java 8 bietet keine gute Möglichkeit, dieses Problem zu beheben. Sie können entweder zu einer einfachen alten for-Schleife zurückkehren oder eine Problemumgehung wie die folgende verwenden:
Map<Integer, Boolean> collect = list.stream() .collect(HashMap::new, (m,v)->m.put(v.getId(), v.getAnswer()), HashMap::putAll);
Diese Problemumgehung verwendet einen HashMap-Konstruktor, der einen Lieferanten als Argument verwendet. Der Lieferant wird verwendet, um eine neue Karteninstanz zu erstellen, wenn der Stream leer ist. In diesem Fall erstellt der Lieferant eine neue HashMap mit einer Standardkapazität von 16 und einem Auslastungsfaktor von 0,75.
Die Problemumgehung verwendet dann die putAll-Methode, um alle Elemente aus dem Stream zur Karte hinzuzufügen. Die putAll-Methode führt die Elemente aus dem Stream in der Karte zusammen und ersetzt alle vorhandenen Elemente mit demselben Schlüssel.
Diese Problemumgehung ist nicht so sauber wie die Collectors.toMap-Methode, funktioniert aber. Außerdem bleibt die Reihenfolge der Elemente im Stream erhalten, was Collectors.toMap nicht tut.
Das obige ist der detaillierte Inhalt vonWarum löst Collectors.toMap eine NullPointerException aus, wenn die Werte Null sind?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!