合并操作中的HashMap null检查

时间:2018-02-27 06:44:13

标签: java-8 collectors

为什么HashMap合并正在对值进行空值检查。 HashMap支持null键和null值。所以有人可以告诉为什么需要对合并进行null检查?

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

由于这个原因,我无法使用Collectors.toMap(Function.identity(), this::get)来收集地图中的值

1 个答案:

答案 0 :(得分:0)

作为上述toMapmerge中具有空值的问题的解决方法 您可以尝试通过以下方式使用自定义收集器:

public static <T, R> Map<T, R> mergeTwoMaps(final Map<T, R> map1,
                                            final Map<T, R> map2,
                                            final BinaryOperator<R> mergeFunction) {
    return Stream.of(map1, map2).flatMap(map -> map.entrySet().stream())
            .collect(HashMap::new,
                    (accumulator, entry) -> {
                        R value = accumulator.containsKey(entry.getKey()) 
                                ? mergeFunction.apply(accumulator.get(entry.getKey()), entry.getValue())
                                : entry.getValue();
                            accumulator.put(entry.getKey(), value);
                    },
                    HashMap::putAll);
}