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

这篇具有很好参考价值的文章主要介绍了Collectors.toMap方法value值为null时的解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题

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

原因

collectors.tomap null,java基础,java,stream

解决方案

方案一

使用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时报空指针异常 解决方案文章来源地址https://www.toymoban.com/news/detail-656278.html

到了这里,关于Collectors.toMap方法value值为null时的解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 详细解决java中的Collectors.toMap引起的java.lang.IllegalStateException: Duplicate key xxx 的错误

    今天,测试在禅道上给我指出一个正式环境 bug ,如下图所示: 即 java.lang.IllegalStateException: Duplicate key 2 。 根据 java.lang.IllegalStateException: Duplicate key 2 可知,这是 java 抛出的存在 2个重复键 的错误。 如果想要弄清楚错误原因,通过如下几个步骤分析: 首先,看到这个错误信息

    2024年01月19日
    浏览(60)
  • redisTemplate.opsForValue().get(KEY)从Redis中取出的值为null 的解决方法

    redisTemplate.opsForValue().get(KEY)从Redis中取出的值为null 的解决方法 最近,博主在整理毕设时就遇到一个问题:我往Redis中存手机验证码,我把手机号当做key ,验证码当做value 存储到 Redis 中,但是在我在需要在登录操作中取验证码时遇到一个问题: 困惑: 我Redis 中明明存的有,

    2024年02月11日
    浏览(45)
  • 全网多种方法解决数据库有数据,但mybatis查询出来的值为Null、为空或不存在的问题

    今天在查询组件详情时,却报出如下错误: 接下里,我便详细分析出现该错误的原因。 首先 debug (断点),如下图所示: debug 结果是 appCustomComponent: null ,于是,找到 mybatis-plus 的打印的 mysql 语句,如下所示:

    2024年02月15日
    浏览(50)
  • Mybatis使用update更新值为null时不生效

    该文章纯属记录使用过程中遇到的问题更新null值没有生效的问题解决办法,内容较为简单。 1.出现的问题 前端修改数据时把属性内容删除然后进行保存,默认传的null,后端更新时属性值为null,然后调用updateById进行更新时发现该属性还是原来的值: 后面百度发现该update方法

    2024年02月04日
    浏览(53)
  • Collectors.groupingBy()进行分组时,分组值存在null值会报NPE(空指针)错误,使用时要注意

    1、使用Collectors.groupingBy()进行分组时,分组值存在null值。 解决办法:分组值为null时,默认值为空字符。

    2024年02月14日
    浏览(66)
  • java实体类属性值为null不返回或者某个属性不返回

    java实体类值为null或者无关紧要的属性,也返回给了前端,看起来不太高明。可以使用JsonInclude注解或者JsonField注解过滤掉。 用在实体类前或者属性前都可以。 用在属性前。 以上示例中,当total为null时不返回,适用于没有分页的情况。

    2024年02月12日
    浏览(43)
  • vue 对后端返回字段值为null的变成空字符串

    // 字段null转字符串 1.export function null2str(data) {     for (let x in data) {         if (data[x] === null) {             // 如果是null 把直接内容转为 \\\'\\\'             data[x] = \\\"\\\";         } else {             if (Array.isArray(data[x])) {                 // 是数组遍历数组 递归继续处理      

    2024年02月11日
    浏览(41)
  • 微信小程序自定义组件boundingClientRect获取到的rect值为null

    const query = wx.createSelectorQuery().in(this) 这一句是最重要的,要用.in(this),this传入的是自定义组件的实例。 不然获取到的rect值为null

    2024年02月13日
    浏览(46)
  • 解决用MybatisPlus修改字段时会自动忽略传值为null的字段

    产生原因 我们使用mybatis-plus框架的时候会产生一个很尴尬的情况,在使用mybatis-plus的自带封装的update的方法的时候,如果你想要修改某个字段为null值,则会自动忽略修改你这个字段,导致这个字段还是原来未修改前的值 。 解决方法 根据查阅相关资料,总结出以下几点解决

    2024年02月16日
    浏览(58)
  • java后端返回数据给前端时去除值为空或NULL的属性、忽略某些属性

    目录 一、使用场景 二、环境准备 1、引入依赖 2、实体类 三、示例 1、不返回空值 (1)方式 (2)测试 (3)说明 2、不返回部分属性 (1)方式 (2)测试 四、 Jackson常用注解 1、 @JsonProperty 2、@JsonPropertyOrder 3、@JsonInclude 4、@JsonIgnoreProperties 5、@JsonFormat 6、@JsonUnwrapped         在开发过程

    2024年02月04日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包