ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

在使用 java.util.stream.Collectors 类的 toMap()方法转为 Map 集合时,一定要注意当 value 为 null 时会抛 NPE 异常。

2022-01-06 17:31:11  阅读:210  来源: 互联网

标签:Map toMap java name TestClass testClass null Optional id


【强制】在使用 java.util.stream.Collectors 类的 toMap()方法转为 Map 集合时,一定要注意当 value 为 null 时会抛 NPE 异常。

个人代码实测

@Test
    public void toMapValueNullTest1() {
        List<TestClass> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            list.add(new TestClass(String.valueOf(i), null));
        }
        list.add(new TestClass("test1", "测试"));
        list.add(new TestClass("test2", "测试2"));
        System.out.println(list);
        Map<String, String> collect;
        try {
            //错误演示 未处理value为null的情况
            //原理:Collectors.toMap底层是基于Map.merge方法来实现的,而merge中value是不能为null的,如果为null,就会抛出空指针异常
            collect = list.stream().collect(Collectors.toMap(TestClass::getId, TestClass::getName, (s, s2) -> s2));
            System.out.println(collect);
        } catch (NullPointerException e) {
            System.out.println("value为null空指针异常");
        }
        //解决方案1 用filter过滤value为null的
        collect = list.stream().filter(testClass -> testClass.getName() != null).collect(Collectors.toMap(TestClass::getId, TestClass::getName, (s, s2) -> s2));
        System.out.println(collect);

        //解决方案2 手动实现重载方法
        Map<Object, Object> collect2 = list.stream().collect(HashMap::new, (map, testClass) -> map.put(testClass.getId(), testClass.getName()), HashMap::putAll);
        System.out.println(collect2);

        //解决方案3 使用原来的for循环或者foreach循环
        Map<String, String> collect3 = new HashMap<>();
        list.forEach(testClass -> collect3.put(testClass.getId(), testClass.getName()));
        System.out.println(collect3);

        //解决方案4 使用Optional包装value
        Map<String, Optional<String>> collect4 = list.stream().collect(Collectors.toMap(TestClass::getId, testClass -> Optional.ofNullable(testClass.getName())));
        System.out.println(collect4);

        //解决方案5 判断如果是null,变为特定的值 (不太好)
        Map<String, String> collect5 = list.stream().collect(Collectors.toMap(TestClass::getId, testClass -> testClass.getName() == null ? "ERROR:null" : testClass.getName()));
        System.out.println(collect5);

    }

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
class TestClass {
private String id;
private String name;
}
 

结果

[Test1.TestClass(id=0, name=null), Test1.TestClass(id=1, name=null), Test1.TestClass(id=2, name=null), Test1.TestClass(id=3, name=null), Test1.TestClass(id=4, name=null), Test1.TestClass(id=5, name=null), Test1.TestClass(id=6, name=null), Test1.TestClass(id=7, name=null), Test1.TestClass(id=8, name=null), Test1.TestClass(id=9, name=null), Test1.TestClass(id=test1, name=测试), Test1.TestClass(id=test2, name=测试2)]
value为null空指针异常
{test2=测试2, test1=测试}
{0=null, 1=null, 2=null, test2=测试2, 3=null, 4=null, 5=null, 6=null, 7=null, 8=null, 9=null, test1=测试}
{0=null, 1=null, 2=null, test2=测试2, 3=null, 4=null, 5=null, 6=null, 7=null, 8=null, 9=null, test1=测试}
{0=Optional.empty, 1=Optional.empty, test2=Optional[测试2], 2=Optional.empty, 3=Optional.empty, 4=Optional.empty, 5=Optional.empty, 6=Optional.empty, 7=Optional.empty, 8=Optional.empty, 9=Optional.empty, test1=Optional[测试]}
{0=ERROR:null, 1=ERROR:null, test2=测试2, 2=ERROR:null, 3=ERROR:null, 4=ERROR:null, 5=ERROR:null, 6=ERROR:null, 7=ERROR:null, 8=ERROR:null, 9=ERROR:null, test1=测试}

 

标签:Map,toMap,java,name,TestClass,testClass,null,Optional,id
来源: https://www.cnblogs.com/ren-LL/p/15772051.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有