2017-04-20 6 views
0

Java8で作業していて、hashmapでnullを使用すると、コレクタが失敗しています。Java 8 Mapがnull値で失敗する

nullポインタ例外が発生しています。私のクエリは、ハッシュマップがnull値を許可する場合、なぜ私はここでnullポインタを取得しているのですか?

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

このtoMapの動作は、Javadocで明らかになっているはずです。 JBSにはオープンなバグがあります:https://bugs.openjdk.java.net/browse/JDK-8148463 –

+1

ちょうどメモとして、 'parallelStream()'を使いません。小さなコレクションや単純なタスクの場合、シーケンシャルストリームよりもはるかに遅くなります。また、1つの要素マップを別のマップに集めることは、並列処理が意味を成さないようなタスクです... – Holger

答えて

2

しかしCollectors.toMap(リスタ下):あなたがマップの値がnullの場合、あなたはNPEを取得します見ることができるように

@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(); 
    ... 

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); 
} 

は、メソッドをマージ使用しています。

関連する問題