自学内容网 自学内容网

[Java基础] stream流中Collectors.toMap报空指针异常情况

代码示例:

        List<BookEntity> bookEntityList = new ArrayList<>();
        BookEntity bookEntity = BookEntity.builder().bookName("钢铁是怎样炼成的").bookOwner("xinliushijian").build();
        BookEntity bookEntity1 = BookEntity.builder().bookName("悲惨世界").bookOwner("xinliu").build();
        bookEntityList.add(bookEntity);
        bookEntityList.add(bookEntity1);

        BookEntity bookEntity2 = BookEntity.builder().bookName(null).bookOwner("shijian1").build();
        BookEntity bookEntity3 = BookEntity.builder().bookName(null).bookOwner("shijian2").build();
        bookEntityList.add(bookEntity2);
        bookEntityList.add(bookEntity3);

        // key中有null,不报错
        Map<String, String> map = bookEntityList.stream()
        .collect(Collectors.toMap(BookEntity::getBookName, BookEntity::getBookOwner, (v1, v2)  -> v2));
        System.out.println(map); // 打印1

        BookEntity bookEntity4 = BookEntity.builder().bookName("笑面人").bookOwner(null).build();
        bookEntityList.add(bookEntity4);
        
        // value中有null,报空指针异常
        Map<String, String> map1 = bookEntityList.stream()
        .collect(Collectors.toMap(BookEntity::getBookName, BookEntity::getBookOwner, (v1, v2)  -> v2));
        System.out.println(map1); // 打印2

打印1:

{null=shijian2, 悲惨世界=xinliu, 钢铁是怎样炼成的=xinliushijian}

打印2:

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 3 R e d u c i n g S i n k . a c c e p t ( R e d u c e O p s . j a v a : 169 ) a t j a v a . u t i l . A r r a y L i s t 3ReducingSink.accept(ReduceOps.java:169) at java.util.ArrayList 3ReducingSink.accept(ReduceOps.java:169)atjava.util.ArrayListArrayListSpliterator.forEachRemaining(ArrayList.java:1384)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
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)

报错原因:
并不是因为map不允许value值为null,我们都知道map中key和value都可以为null,而是merge方法中value不允许为null

在这里插入图片描述

解决办法:
所以在进行map转换之前,若无法保证数据非空,还是需要过滤下数据,只保留非空的部分数据(key为null一般无意义,也不要了)

// 正确写法
Map<String, String> map2 = bookEntityList.stream()
.filter(v -> !StringUtils.isAnyBlank(v.getBookName(), v.getBookOwner()))
.collect(Collectors.toMap(BookEntity::getBookName, BookEntity::getBookOwner, (v1, v2)  -> v2));
System.out.println(map2); // 打印3

打印3:

{悲惨世界=xinliu, 钢铁是怎样炼成的=xinliushijian}


原文地址:https://blog.csdn.net/weixin_43024834/article/details/148569632

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!