Stream中toMap引发NullPointerException

1、引发NullPointerException的代码如下:

List<SelfSettlementCardInfoDto> selfSettlementCardInfoDtos =selfCardAdapterManager.listSelfSettlementCardInfoDtoByCardIds(queryDto.getPartnerId(), cardIds, false);
Map<Long, String> cardIdCardNoTokenMap = selfSettlementCardInfoDtos.stream().collect(Collectors.toMap(SelfSettlementCardInfoDto::getId, SelfSettlementCardInfoDto::getCardNoToken));

其中selfSettlementCardInfoDtos中的cardNoToken有可能为空。

习惯性地认为hashmap支持指针和值为null,而stream中的toMap()方法也是用HashMap实现的,因此看到这个地方报NullPointerException的时候,很奇怪。

2、分析

查看toMap()源码:

进入merge()方法:

看到:

Objects.requireNonNull(remappingFunction);
Objects.requireNonNull(value);

大概就知道了:toMap方法不允许null值

因此:
Stream中toMap不允许key和value为null

3、改进方法:

1、不用toMap方法

Map<Long, String> cardIdCardNoTokenMap = selfSettlementCardInfoDtos.stream().collect(HashMap::new, (m,v)->m.put(v.getId(), v.getCardNoToken()), HashMap::putAll);

2、在流中加上判空过滤

Map<Long, String> cardIdCardNoTokenMap = selfSettlementCardInfoDtos.stream().filter(t -> t.getCardNoToken() != null).collect(Collectors.toMap(SelfSettlementCardInfoDto::getId, SelfSettlementCardInfoDto::getCardNoToken));

Stream的执行流程

Stream流中,每一个遍历的对象执行完所有的操作后,才会对下一个对象进行操作。

    @Testpublic void test10() {String[] s={"a","b","c","d"};List<String> collect = Stream.of(s).filter(s1 -> {System.out.println("s1");return s1.length() == 1;}).filter(s2 -> {System.out.println("s2");return s2.length() == 1;}).collect(Collectors.toList());System.out.println(collect);}

结果如下:

s1
s2
s1
s2
s1
s2
s1
s2
[a, b, c, d]

Stream中toMap引发NullPointerException____Stream的执行流程相关推荐

  1. MySQL中SQL生命周期与执行流程

    [1]MySQL执行流程 从MySQL的逻辑架构来看,如下图所示. 这里首先我们分析一下查询缓存,其在MySQL8中已经被抛弃. ① 查询缓存 Server如果在查询缓存中发现了这条SQL语句,就会直 ...

  2. Java8 Stream 中的 reduce() 方法,执行聚合操作

    初识 Stream 中的 reduce() 方法,是在最近一次刷算法题的过程中(下面会讲到),简洁干练的写法,让我眼前一亮. 所以,我简单学习了,总结了一下写法: 正文 Java 8 API添加了一个 ...

  3. Java中synchronized同步块的执行流程

    必要知识 Java 对象的数据结构 在 HotSpot 虚拟机中,Java 对象在内存中存储的布局可以分为 3 块区域:对象头(Header).实例数据(Instance Data)和对齐填充(Pad ...

  4. 分布式锁 动态代理 Java数据结构List,Set,Map,Spring执行流程,Spring MVC组件

    这里对今日的内容进行总结: 分布式锁具备的条件: 具备的条件: 在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行. 高可用的获取锁与释放锁. 高性能的获取锁与释放锁. 具备可重入的特 ...

  5. 呕心沥血整理出来的mysql执行流程,一定要看!

    我曾踏足山巅,也曾进入低谷,二者都令我受益良多. -----宝石骑士-塔里克 你有多了解mysql? 说到mysql,相信很多人对他都不陌生,尤其是后端开发和DBA,更是熟悉地不能再熟悉了,什么mys ...

  6. Caffe中对MNIST执行train操作执行流程解析

    之前在 http://blog.csdn.net/fengbingchun/article/details/49849225 中简单介绍过使用Caffe train MNIST的文章,当时只是仿照ca ...

  7. djangorestframework源码分析1:generics中的view执行流程

    djangorestframework源码分析 本文环境python3.5.2,djangorestframework (3.5.1)系列 djangorestframework源码分析-generi ...

  8. 一文搞懂select语句在MySQL中的执行流程!

    MySQL作为互联网行业使用最多的关系型数据库之一,与其免费.开源的特性是密不可分的.然而,很多小伙伴工作了很多年,只知道使用MySQL进行CRUD操作,这也导致很多小伙伴工作多年后,想跳槽进入大厂, ...

  9. 中dubbo所需要的依赖_Dubbo介绍、dubbo架构图、dubbo运行和执行流程、dubbo支持的协议以及支持的注册中心...

    第67次(Dubbo) 学习主题:Dubbo 学习目标: 掌握Dubbo的作用,理解Dubbo的架构图 掌握Dubbo支持的协议以及支持的注册中心 1. Dubbo介绍 1.1 什么是Dubbo? D ...

最新文章

  1. Asp.net Core认证和授权:JWT认证和授权
  2. 搞开源也会被死亡恐吓!
  3. 可用等式为:html+java=jsp表示jsp[8]._java jsp
  4. esp32 怎么分配freertos 堆栈大小_嵌入式开发入门-从STM32CudeMX、FreeRtos、Proteu仿真开始...
  5. php url地址 怎么写,php url地址重写
  6. CSS 定位 四种定位
  7. LintCode MySQL 1932/1933. 挂科最多的同学 I / II
  8. C++官方文档-this
  9. C#企业级开发案例精解:用经典案例学通 NET技术
  10. Java中符号位扩展
  11. 大整数算法[10] Comba乘法(实现)
  12. win7激活一万遍都没解决的同学请看过来
  13. css:clac计算
  14. Android答题计时的代码,Android答题倒计时
  15. Android通过USB与PC通信
  16. 大数据入门级学习攻略
  17. 【Java】Java中的常用工具类(排名前 16)
  18. matlab 画图基本介绍
  19. char*与string的区别
  20. 【答学员问】网站换ip后遇到的问题排查思路

热门文章

  1. drcom linux怎么运行,linux下使用drcom登录认证
  2. java 使用接口便于维护程序_Java初学——面向对象接口的应用
  3. java 循环对比_Java stream 和 for 循环效率对比问题
  4. apple组织名称是什么_什么是Apple Macintosh?
  5. 移动最小二乘_最小移动以形成弦
  6. 单位矩阵属性(I ^ k = I)| 使用Python的线性代数
  7. java 枚举迭代_Java中的枚举和迭代器之间的区别
  8. 第 1-3 课:深入理解字符串 + 面试题
  9. HashMap 为什么会导致 CPU 100%?文章看不懂?来看这个视频吧!——面试突击 006 期...
  10. python ping利用线程池获取在线设备