stream().collect()的坑

Java8 Stream 操作 Collectors.toMap()会出现NullPointerException异常

        List<People> peopleList = new ArrayList<>();
        People people = new People();
        people.setId(1L);
        people.setUserName("sasa");
        peopleList.add(people);

        People people1 = new People();
        people1.setId(2L);
        peopleList.add(people1);

        Map<Long, String> map = peopleList.stream().collect(Collectors.toMap(People::getId, People::getUserName));
        System.out.println(map);

通过执行程序发现报错

Exception in thread "main" java.lang.NullPointerException
	at java.util.HashMap.merge(HashMap.java:1225)
	at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
	at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
	at com.example.demo.test.test.main(test.java:32)

Process finished with exit code 1

这是因为getUserName == null 引起的报错,为了解决这个坑,可以改为:

Map<Long, String> map2 = new HashMap<>();
        for (People people2 : peopleList){
            map2.put(people2.getId(), people2.getUserName());
        }

或者

Map<Long, String> map1 = new HashMap<>();
        peopleList.forEach(x->{
            map1.put(x.getId(), x.getUserName());
        });

或者

Map<Long, String> map3 = peopleList.stream().collect(Collectors.toMap(People::getId, x -> x.getUserName() == null ? "":x.getUserName()));
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值