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