2017-04-20 3 views
0

Ich arbeitete an Java8 und fand Kollektor ist fehlgeschlagen, wenn ich Null in hashmap verwenden.Java 8 Map schlägt für Nullwerte fehl

Ich bekomme Nullzeiger Ausnahme. Meine Abfrage ist, wenn Hash-Map Null-Werte erlaubt, warum ich hier null Zeiger bekomme.

public class Test { 

    public static void main(String[] args) { 
     HashMap<String, String> m = new HashMap<>(); 
     m.put("abc", null); 

     m.entrySet().parallelStream().collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())); 

    } 

} 
+1

Dieses Verhalten von 'toMap' sollte wahrscheinlich im Javadoc geklärt werden. Es gibt einen offenen Fehler in JBS: https://bugs.openjdk.java.net/browse/JDK-8148463 –

+1

Nur als eine Randnotiz, verwenden Sie nicht 'parallelStream()' gedankenlos. Für kleine Sammlungen und/oder einfache Aufgaben ist es viel langsamer als ein sequenzieller Stream. Und das Sammeln einer einzelnen Elementkarte in einer anderen Karte ist eine solche Aufgabe, bei der Parallelverarbeitung keinen Sinn ergibt ... – Holger

Antwort

2

Aber Collectors.toMap (lister unten):

public static <T, K, U, M extends Map<K, U>> 
Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper, 
          Function<? super T, ? extends U> valueMapper, 
          BinaryOperator<U> mergeFunction, 
          Supplier<M> mapSupplier) { 
    BiConsumer<M, T> accumulator 
      = (map, element) -> map.merge(keyMapper.apply(element), 
              valueMapper.apply(element), mergeFunction); 
    return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID); 
} 

Anwendungen verschmelzen Methode:

@Override 
public V merge(K key, V value, 
       BiFunction<? super V, ? super V, ? extends V> remappingFunction) { 
    if (value == null) 
     throw new NullPointerException(); 
    if (remappingFunction == null) 
     throw new NullPointerException(); 
    ... 

Wie Sie sehen können, wenn Karten Wert null ist, werden Sie NPE bekommen.

Verwandte Themen