一、Stream 流在使用toMap时跑出的NPE
final Map<String, SuperviseOrganization> superviseOrganizationMap = superviseOrganizations.stream().collect(Collectors.toMap(SuperviseOrganization::getAgencyName, SuperviseOrganization::getAgencyCode, (k1, k2) -> k1));
原因是在底层使用了Map下的merge方法,如果 map中的 Value 值为空就会报错
default V merge(K key, V value,
BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
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;
}
可以使用Optional.ofNullable保证value值不为null
Map<String, String> riskMap = riskStatus.stream().distinct().collect(Collectors.toMap(SimpleIdAndStatus::getId, s-> Optional.ofNullable(s.getStatus()).orElse(""), (m, n) -> n));
二、使用import org.apache.commons.beanutils.BeanUtils; 包下的populate 将Map转换为JavaBean的对象时引发的异常
BeanUtils.populate(bean,map);
如果对应的map中存在不可转换的类型会报错,例如我map中有个字段 cost :'null' 此时,null 为字符串
我要将cost转换为javaBean 中对应BigDecimal类型的cost字段,此时就会在转换时报错。
三、在使用JPA和HIbernate时,不能直接在模型对象上修改,由于自带的机制,会将数据库查询出的模型写入数据库。