Stream中toMap引发NullPointerException____Stream的执行流程
生活随笔
收集整理的這篇文章主要介紹了
Stream中toMap引发NullPointerException____Stream的执行流程
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Stream中toMap引發(fā)NullPointerException
1、引發(fā)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實現(xiàn)的,因此看到這個地方報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的執(zhí)行流程
Stream流中,每一個遍歷的對象執(zhí)行完所有的操作后,才會對下一個對象進行操作。
@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的执行流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++17(18)-static_cas
- 下一篇: java8中的map与flatmap区别