Collectors.toMap方法value值为null时的解决方案

问题

发现Collectors.toMap的一个坑,key可以为null,但value不能为null,否则抛空指针异常nullPointerException。这可真是反直觉。

原因

在这里插入图片描述

解决方案

方案一

使用Optional类处理value,优点是可以继续使用Collectors.toMap,缺点是为null的value会被改,而这可能违反业务上的期望。

方案二

使用 Stream#collect(java.util.function.Supplier<R>, java.util.function.BiConsumer<R,? super T>, java.util.function.BiConsumer<R,R>)方法,可以保留为null的value。所以个人推荐方案二。

两个方案的代码如下:

public class TestCollect {

  static class User {

    String userName;
    String idCard;

    public String getUserName() {
      return userName;
    }


    public String getIdCard() {
      return idCard;
    }

    public User(String userName, String idCard) {
      this.userName = userName;
      this.idCard = idCard;
    }

  }

  public static void main(String[] args) {
    User user01 = new User("user01", "000000001");
    User user02 = new User("user02", "000000002");
    User user03 = new User("user03", "000000003");
    User user04 = new User(null, "000000004");
    User user05 = new User("user05", null);
    User user06 = new User("user05", "a");
    User user07 = new User("user05", "b");
    ArrayList<User> list = new ArrayList();
    list.add(user01);
    list.add(user02);
    list.add(user03);
    list.add(user04);
    list.add(user05);
    list.add(user06);
    list.add(user07);

    /**
     * key可以为null, value不可以为null
     */
//    HashMap<String, String> map01 = list.stream().collect(
//        Collectors.toMap(User::getUserName, User::getIdCard, (a, b) -> b, HashMap::new));
//    System.out.println(map01);

    //解决方案一,使用Optional类处理null
    HashMap<String, String> map02 = list.stream().collect(Collectors
        .toMap(User::getUserName, s -> Optional.ofNullable(s.getIdCard()).orElse("空的"), (a, b) -> b,
            HashMap::new));
    System.out.println(map02);

    //解决方案二,直接使用collect()方法进行规约操作
    HashMap<String, String> map03 = list.stream()
        .collect(HashMap::new, (map, item) -> map.put(item.getUserName(), item.getIdCard()),
            HashMap::putAll);
    System.out.println(map03);

  }
}


主要参考: Stream使用Collector.tomap方法value值为null时报空指针异常 解决方案

  • 15
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
回答: 在使用Collectors.toMap方法,如果字段值为null,可能会导致NullPointerException的报错。根据引用\[1\]的分析,报错的原因是在Map中有一个键值对的valuenull值。根据引用\[2\]的描述,第一个实现中通过Objects.requireNonNull(valueMapper.apply(element))来控制value不能为null。因此,如果要返回的Map中的value可能为null,可以使用Optional.ofNullable(entry.getValue()).orElse("")来处理,将null值替换为一个默认值。例如,可以使用以下方式来处理字段值为null的情况:Map<String, String> resultMap = map.entrySet().stream().collect(Collectors.toMap(entry -> entry.getKey(), entry -> Optional.ofNullable(entry.getValue()).orElse(""))); \[3\] #### 引用[.reference_title] - *1* *3* [java8 StreamCollectors.toMapvaluenull报空指针异常(NPE)](https://blog.csdn.net/davis_23/article/details/129146364)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [解决Java `Collectors.toMap` 方法 valuenull不支持的问题](https://blog.csdn.net/weixin_48990070/article/details/125428557)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_23204557

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值