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