JAVA8新特性stream流收集为Map,value为null导致空指针的问题

这篇具有很好参考价值的文章主要介绍了JAVA8新特性stream流收集为Map,value为null导致空指针的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

jdk8

新特性stream深受喜爱,平时使用比较多,其中有:

Map<String, String> collect2 = 
list.stream().collect(Collectors.toMap(Book::getName, Book::getIdNO,(pre, after) -> pre));

 现象如下:

package MainTest.stream;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

public class StreamListToMap {

    public static void main(String[] args) {
        List<Book> list = new ArrayList<>();
        list.add(new Book("master amber", 1987, "ASHJBYGSFDFG15"));
        list.add(new Book("slaver amber", 1987, "IJFGNMKETRE58"));
        list.add(new Book("master amber", 1999, "MYHGORPJFJ64"));
        list.add(new Book("ssdas", 12414, null));
        list.add(new Book("fkajh", 32423, null));


        // 问题1:jdk8这种情况下,value为空会报错,jdk9解决了这个问题(key为null没有问题)
        System.out.println("==============");
        Map<String, String> collect2 = list.stream().collect(Collectors.toMap(Book::getName, Book::getIdNo,(pre, after) -> pre));
        for (String key : collect2.keySet()) {
            System.out.println("key:"+key + "=======value:"+collect2.get(key));
        }

    }


    public static class Book {
        private String name;

        private int year;

        private String idNo;

        Book(String name, int year, String idNo) {
            this.name = name;
            this.year = year;
            this.idNo = idNo;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getYear() {
            return year;
        }

        public void setYear(int year) {
            this.year = year;
        }

        public String getIdNo() {
            return idNo;
        }

        public void setIdNo(String idNo) {
            this.idNo = idNo;
        }
    }
}

JAVA8新特性stream流收集为Map,value为null导致空指针的问题

问题:JDK8环境下,如果Book::getIdNo 为null的话会报空指针,即JDK8环境下的,该接口不支持value为null(key为null没这个问题)

<R, A> R collect(Collector<? super T, A, R> collector);

该接口不支持valueMapper为null,JDK9解决了这个问题 

解决方案:

1.升级JDK9

2.按需求可以过滤掉null的value 

3.使用另一个collect接口

<R> R collect(Supplier<R> supplier,BiConsumer<R, ? super T> accumulator,
              BiConsumer<R, R> combiner);

Supplier<R> supplier :收集器返回的容器

BiConsumer<R, ? super T> accumulator : 消费者,R参数是返回结果类型,? super T 一般值list内元素

BiConsumer<R, R> combiner:联合器,主要是并行流下使用(parallel),非并行流不使用改参数,但不能为null

package MainTest.stream;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

public class StreamListToMap {

    public static void main(String[] args) {
        List<Book> list = new ArrayList<>();
        list.add(new Book("master amber", 1987, "ASHJBYGSFDFG15"));
        list.add(new Book("slaver amber", 1987, "IJFGNMKETRE58"));
        list.add(new Book("master amber", 1999, "MYHGORPJFJ64"));
        list.add(new Book("ssdas", 12414, null));
        list.add(new Book("fkajh", 32423, null));


        /*// 问题1:jdk8这种情况下,value为空会报错,jdk9解决了这个问题(key为null没有问题)
        System.out.println("==============");
        Map<String, String> collect2 = list.stream().collect(Collectors.toMap(Book::getName, Book::getIdNo,(pre, after) -> pre));
        for (String key : collect2.keySet()) {
            System.out.println("key:"+key + "=======value:"+collect2.get(key));
        }*/

        // 问题1解决方案1
        System.out.println("==============");
        HashMap<String, String> collect3 = list.stream().parallel().collect(HashMap::new, (n, v) -> n.put(v.getName(), v.getIdNo()), HashMap::putAll);
        for (String key : collect3.keySet()) {
            System.out.println("key:"+key + "=======value:"+collect3.get(key));
        }
        // 问题1解决方案2 过滤掉null的,看需求
        System.out.println("==============");
        HashMap<String, String> collect4 = list.stream().filter(l-> Objects.nonNull(l) && Objects.nonNull(l.idNo)).collect(HashMap::new, (n, v) -> n.put(v.getName(), v.getIdNo()), HashMap::putAll);
        for (String key : collect4.keySet()) {
            System.out.println("key:"+key + "=======value:"+collect4.get(key));
        }


    }


    public static class Book {
        private String name;

        private int year;

        private String idNo;

        Book(String name, int year, String idNo) {
            this.name = name;
            this.year = year;
            this.idNo = idNo;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getYear() {
            return year;
        }

        public void setYear(int year) {
            this.year = year;
        }

        public String getIdNo() {
            return idNo;
        }

        public void setIdNo(String idNo) {
            this.idNo = idNo;
        }
    }
}

 JAVA8新特性stream流收集为Map,value为null导致空指针的问题

JDK8的bug ,还是新特性功能的bug,并且在下个版本做了修复,特此记录!!希望能帮到你奥!文章来源地址https://www.toymoban.com/news/detail-456286.html

到了这里,关于JAVA8新特性stream流收集为Map,value为null导致空指针的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • JAVA8新特性(Stream API,LocalDate,LocalDateTime)

    一. Stream API 1.1 基础 代码参数准备: 场景一:知道一个ListUser对象,如何获取ListUser的所有用户id? 场景二:知道一个ListUser对象,如何获取ListUser中年龄大于50的用户? 场景三:知道一个ListUser对象,如何按照年龄从小到小排序,从大到小排序? 场景四:知道一个ListUser对象

    2024年02月16日
    浏览(11)
  • 带你走进Java8新特性Stream流的小世界

    带你走进Java8新特性Stream流的小世界

    目录 一. 什么是流(Stream) 1.1 流的定义 1.2 流的特点 1.3 操作流 1.4 创建流 二. 流的中间操作 2.1 流的筛选与切片 2.1.1 filter 2.1.2 limit 2.1.3 skip 2.1.4 distinct 2.2 流的映射 2.2.1 map 2.2.2 flatMap 2.3 流的排序 2.3.1 sort 三. 流的终止操作 3.1 流的查找与匹配 3.1.1 allMatch 3.1.2 anyMatch 3.1.3 none

    2024年01月24日
    浏览(19)
  • java8新特性Stream流中anyMatch和allMatch和noneMatch的使用!!!

    判断数据列表中是否存在任意一个元素符合设置的predicate条件,如果是就返回true,否则返回false。 接口定义: boolean anyMatch(Predicate? super T predicate); 方法描述: 在anyMatch 接口定义中是接收 Predicate 类型参数,在Lamdba表达式中 PredicateT 是接收一个T类型参数,然后经过逻辑验证返

    2024年02月08日
    浏览(12)
  • Java8使用stream流给List<Map<String,Object>>分组(多字段key)

    Java8使用 stream流 给ListMapString,Object根据字段key 分组 一、项目场景: 从已得到的List集合中,根据某一元素(这里指map的key)进行分组,筛选出需要的数据。 如果是SQL的话则使用 group by 直接实现,代码的方式则如下: 使用到stream流的 Collectors.groupingBy() 方法。 二、代码实现 1、首

    2024年02月02日
    浏览(38)
  • Cannot invoke “Object.toString()“ because the return value of “java.util.Map.get(Object)“ is null

    Cannot invoke “Object.toString()“ because the return value of “java.util.Map.get(Object)“ is null

    在写瑞吉外卖的时候遇到 Object.toString()为空的问题,最后发现是 前端没有往后端传递数据,第一个图片是只传的phone最后改为from第二个是没有写函数sendMsgApi,改正后,发现登录进去又回退到主页面,发现是因为在过滤器中要保存session,保存后才能发送,再次添加形参Http

    2024年02月02日
    浏览(13)
  • Stream两个Map的value值进行相加/相减,并将合并数据集赋值给新Map

    Stream两个Map的value值进行相加/相减,并将合并数据集赋值给新Map

    最近做项目遇到,需要把两个Map中的value值进行相加或相减,循环遍历方法太麻烦,有时候数据量大的时候,还会超时。因此使用java8中Stream的Merge方法来处理上述问题,使用如下: 结果截图: 从结果图中可以看出,两个map进行相加或者相减是可以看出,key值相同的进行valu

    2024年02月14日
    浏览(91)
  • 使用stream流对List<Map<String, Object>>集合根据value进行排序

    第一步:初始化数据 ========================================================= 第二步:开始排序 ① 根据数字排序 打印结果 ② 根据字符串排序 打印结果 ③ 根据时间类型排序 打印结果 总结:String类型是万金油的排序方式,基本都可以用!!! 补充一个排序方法 打印结果 就这样。。。

    2024年02月16日
    浏览(39)
  • Java8 - Streams flatMap()

    Java8 - Streams flatMap()

    https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html 它由一个 2 级 Stream 或一个二维数组组成 。 在 Java 8 中,我们可以使用 flatMap 将上述 2 级 Stream 转换为 一级 Stream 或将 二维数组转换为 一维数组。 简言之, flatmap 方法让你把一个流中的每个值都换成另一个流,然后把所有

    2024年02月03日
    浏览(7)
  • Java8 Stream流的合并

    最近的需求里有这样一个场景,要校验一个集合中每个对象的多个Id的有效性。比如一个Customer对象,有3个Id: id1 , id2 , id3 ,要把这些Id全部取出来,然后去数据库里查询它们是否存在。 通常情况下,我们都是从集合中取出对象的某一个字段,像这样: 现在要取3个字段,

    2024年02月02日
    浏览(13)
  • 《Java8实战》第11章 用 Optional 取代 null

    《Java8实战》第11章 用 Optional 取代 null

    11.1 如何为缺失的值建模 上面的这种代码就很容易出现NullPointerException的异常。 11.1.1 采用防御式检查减少 NullPointerException 为了避免NullPointerException异常,一般就会加很多判断。 这种每次引用一次变量都做一次null的检查。 11.1.2 null 带来的种种问题 它是错误之源。 NullPointerE

    2023年04月19日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包