使用 Stream 流 toMap 的NPE、

一、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时,不能直接在模型对象上修改,由于自带的机制,会将数据库查询出的模型写入数据库。

posted @ 2023-03-10 18:08  代码红了一大片  阅读(85)  评论(0编辑  收藏  举报