Java8中流的Collectors.toMap操作当key或value为null时报异常

1.问题描述

方法①

Map<Integer, String> map = users.stream().collect(Collectors.toMap(User::getId, User::getTitle, (a, b) -> b));

方法②

Map<Integer, String> map = new HashMap<>();
for (User user : users) {
    map.put(user.getId(), user.getName());
}

当user.getId或user.getName有null时候,使用第一种会报异常

java.lang.NullPointerException: null
at java.util.HashMap.merge(HashMap.java:1225)

在使用时候,无法确保都有值时候推荐使用第二种

2.源码分析

default V merge(K key, V value,
            BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
        // 这里进行key-value判断是否为null,为null抛异常
        Objects.requireNonNull(remappingFunction);
        Objects.requireNonNull(value);
        V oldValue = get(key);
        V newValue = (oldValue == null) ? value :
                   remappingFunction.apply(oldValue, value);
        if(newValue == null) {
            remove(key);
        } else {
            put(key, newValue);
        }
        return newValue;
    }
public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容