问题 发现Collectors.toMap的一个坑,key可以为null,但value不能为null,否则抛空指针异常nullPointerException。这可真是反直觉。 原因 解决方案 方案
发现Collectors.toMap的一个坑,key可以为null,但value不能为null,否则抛空指针异常nullPointerException。这可真是反直觉。
使用Optional类处理value,优点是可以继续使用Collectors.toMap,缺点是为null的value会被改,而这可能违反业务上的期望。
使用 Stream#collect(java.util.function.Supplier
方法,可以保留为null的value。所以个人推荐方案二。
两个方案的代码如下:
public class TestCollect { static class User { String userName; String idCard; public String getUserName() { return userName; } public String getIdCard() { return idCard; } public User(String userName, String idCard) { this.userName = userName; this.idCard = idCard; } } public static void main(String[] args) { User user01 = new User("user01", "000000001"); User user02 = new User("user02", "000000002"); User user03 = new User("user03", "000000003"); User user04 = new User(null, "000000004"); User user05 = new User("user05", null); User user06 = new User("user05", "a"); User user07 = new User("user05", "b"); ArrayList<User> list = new ArrayList(); list.add(user01); list.add(user02); list.add(user03); list.add(user04); list.add(user05); list.add(user06); list.add(user07); // HashMap 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(User::getUserName, s -> Optional.ofNullable(s.getIdCard()).orElse("空的"), (a, b) -> b, HashMap::new)); System.out.println(map02); //解决方案二,直接使用collect()方法进行规约操作 HashMap<String, String> map03 = list.stream() .collect(HashMap::new, (map, item) -> map.put(item.getUserName(), item.getIdCard()), HashMap::putAll); System.out.println(map03); }}
主要参考: Stream使用Collector.tomap方法value值为null时报空指针异常 解决方案
来源地址:https://blog.csdn.net/qq_23204557/article/details/127558822
--结束END--
本文标题: Collectors.toMap方法value值为null时的解决方案
本文链接: https://lsjlt.com/news/421539.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-04-01
2024-04-03
2024-04-03
2024-01-21
2024-01-21
2024-01-21
2024-01-21
2023-12-23
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0