Stream使用Collector.tomap方法value值為null時報空指針異常 解決方案


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);
    }
}
  
  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM