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