Stream中toMap引发NullPointerException____Stream的执行流程
生活随笔
收集整理的這篇文章主要介紹了
Stream中toMap引发NullPointerException____Stream的执行流程
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
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有可能為空。
習(xí)慣性地認(rèn)為hashmap支持指針和值為null,而stream中的toMap()方法也是用HashMap實(shí)現(xiàn)的,因此看到這個(gè)地方報(bào)NullPointerException的時(shí)候,很奇怪。
2、分析
查看toMap()源碼:
進(jìn)入merge()方法:
看到:
Objects.requireNonNull(remappingFunction);
Objects.requireNonNull(value);
大概就知道了:toMap方法不允許null值
因此:
Stream中toMap不允許key和value為null
3、改進(jìn)方法:
1、不用toMap方法
Map<Long, String> cardIdCardNoTokenMap = selfSettlementCardInfoDtos.stream().collect(HashMap::new, (m,v)->m.put(v.getId(), v.getCardNoToken()), HashMap::putAll);2、在流中加上判空過(guò)濾
Map<Long, String> cardIdCardNoTokenMap = selfSettlementCardInfoDtos.stream().filter(t -> t.getCardNoToken() != null).collect(Collectors.toMap(SelfSettlementCardInfoDto::getId, SelfSettlementCardInfoDto::getCardNoToken));Stream的執(zhí)行流程
Stream流中,每一個(gè)遍歷的對(duì)象執(zhí)行完所有的操作后,才會(huì)對(duì)下一個(gè)對(duì)象進(jìn)行操作。
@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);}結(jié)果如下:
s1 s2 s1 s2 s1 s2 s1 s2 [a, b, c, d]總結(jié)
以上是生活随笔為你收集整理的Stream中toMap引发NullPointerException____Stream的执行流程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c++17(18)-static_cas
- 下一篇: java8中的map与flatmap区别