Stream使用Collector.tomap方法value值为null时报空指针异常 解决方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import junit.framework.TestCase;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Optional;
import java.util.stream.Collectors;
 
public class TestCollect extends TestCase {
    class User {
        String userName;
        String sex;
        String idCard;
 
        //省略Getter and Setter  and Constructor方法
    }
 
    /**
     * @param
     * @description: 取出集合中User对象的userName和idCard属性取出放在map中
     * @return: void
     * @author: Sue
     * @date: 2020/8/14
     */
    public void testCollect() {
        User user01 = new User("user01", "male", "000000001");
        User user02 = new User("user02", "male", "000000002");
        User user03 = new User("user03", "male", "000000003");
        User user04 = new User(null, "male", "000000004");
        User user05 = new User("user05", "male", null);
        ArrayList<User> list = new ArrayList();
        list.add(user01);
        list.add(user02);
        list.add(user03);
        list.add(user04);
        list.add(user05);
 
        /**
         * 当存在value值为空时,使用Collectors.toMap()会报NPE
         * 原因:底层调用了Map的merge方法,而map方法规定了此处的vlue不能为null,从而抛出空指针异常
         * Objects.requireNonNull(value);
         */
//        HashMap<String, String> map01 = list.stream().collect(Collectors.toMap(User::getUserName, User::getIdCard, (a, b) -> b, HashMap::new));
//        System.out.println(map01);
 
        //解决方案一,使用Optional类处理null
        HashMap<String, String> map02 = list.stream().collect(Collectors
                .toMap(s -> Optional.ofNullable(s.getUserName()).orElse("空的"), s -> Optional.ofNullable(s.getSex()).orElse("空的"), (a, b) -> b, HashMap::new));
        System.out.println(map02);
 
        //解决方案二,直接使用collect()方法进行规约操作,关于这里collect方法的使用可以看这篇文章 https://www.cnblogs.com/sueyyyy/p/13502116.html
        HashMap<String, String> map03 = list.stream().collect(HashMap::new, (map, item) -> map.put(item.getUserName(), item.getSex()), HashMap::putAll);
        System.out.println(map03);
    }
}
  
  

  

posted @   少说点话  阅读(9553)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
网站运行:7年51天17时24分14秒
点击右上角即可分享
微信分享提示