ImmutableMap不可使用null的问题
示例
在项目中有发现类似下方的代码,
Map tmpParams = ImmutableMap.of(
"extraInfos", ext.get("extraInfos"),
"otherParams" , ImmutableMap.builder()
.put("version" , 0)
.put("orderId" , MapUtils.getString(ext,"orderId");
实际运行时偶尔出现npe
错误, 原因在于orderId对应的值为null
, 而ImmutableMap的key和value均不可为null值.
特别是对于null vlaues的问题, 在guava对应的github issue中有讨论
官方建议使用Optional
的方式来包装, 在不允许用null值的情况下inline/stream也更方便.
除ImmutableMap外, 包括LoadingCache等其它guava组件也是不允许null vlaues, 这点需要注意.
如果想直接用允许Null的值的不可变map, 可以这样
Map<String, String> testMap = new HashMap<>();
testMap.put("a", "1");
Map<String, String> immutableMap = Collections.unmodifiableMap(new HashMap<>(testMap));
此时不能直接更改key和value, 但如果value是对象, 其field可以修改
总结
简单总结一下, ImmutableMap的使用场景:
适合
- 确定性的配置, 比如根据不同的key值得到不同的请求url
- 写单元测试
不适合
- key, value为未知参数, 可能有null产生的情况
感受
上面的例子如果用HashMap
写, 不会有任何问题, 所以使用工具类时最好有一定了解, 不然可能会有一些意外问题出现.
ImmutableMap不可使用null的问题的更多相关文章
- Springboot实现VNC的反向代理
背景 用户需要通过前端HTML页面的noVNC(noVNC是什么?)客户端连接底层VNC Server服务端,为了防止VNC Server的IP暴露,因此需要做一层代理.正常情况下使用Nginx. ...
- 《深入理解JAVA虚拟机》笔记1
java程序运行时的内存空间,按照虚拟机规范有下面几项: )程序计数器 指示下条命令执行地址.当然是线程私有,不然线程怎么能并行的起来. 不重要,占内存很小,忽略不计. )方法区 这个名字很让我迷惑. ...
- java ImmutableMap使用
原文地址:https://blog.csdn.net/wantsToBeASinger/article/details/84997362 java中的Immutable对象: 简单地说,如果一个对象实 ...
- 使用ImmutableMap简化语句
项目实战 最近接了一个出行权益的需求,回调的状态有十几种,需要转换为进行中,取消,已完成几种状态进行订单状态的展示,使用ImmutableMap可以简化语句,替代使用if-else 语句或者switc ...
- Java源码分析:Guava之不可变集合ImmutableMap的源码分析
一.案例场景 遇到过这样的场景,在定义一个static修饰的Map时,使用了大量的put()方法赋值,就类似这样-- public static final Map<String,String& ...
- 【小计】新人Tostring前忘记Null判断的处理
ToString和string.Concat(可屏蔽Null的异常)性能相差不大,一些中小项目完全可以用Concat(新人容易忘记判断Null的情况,遇到太多了,所以建议重写tostring方法,内部 ...
- SQL Server-聚焦NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL性能分析(十八)
前言 本节我们来综合比较NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL的性能,简短的内容,深入的理解,Always to review the basics. ...
- 异步 HttpContext.Current 为空null 另一种解决方法
1.场景 在导入通讯录过程中,把导入的失败.成功的号码数进行统计,然后保存到session中,客户端通过轮询显示状态. 在实现过程中,使用的async调用方法,出现HttpContext.Curren ...
- js中的null 和undefined
参考链接:http://blog.csdn.net/qq_26676207/article/details/53100912 http://www.ruanyifeng.com/blog/2014/0 ...
随机推荐
- 如何访问linux服务器上的mysql8.0
首先安装好了mysql-connector 1.1. 下载: 官网下载zip包,我下载的是64位的: 下载地址:https://dev.mysql.com/downloads/mysql/ 下载zip ...
- Putty保存设置
使用putty连接服务器每次都要配置编码,有时候忘了配置,提示就出现中文乱码真是坑爹(纯英文提示也行啊),好了闲话少说,步入正题. Putty的设置保存功能隐藏的实在太好了,原来在Connection ...
- Spring注解驱动开发(四)-----aop、声明式事务
AOP 概念 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式:-----基于动态代理 一个aop示例 1.导入aop模块:Spring AOP:(spring-aspects ...
- PAT甲级——A1015 Reversible Primes
A reversible prime in any number system is a prime whose "reverse" in that number system i ...
- sql删除重复的记录保留一条
delete from A_TO_NOW where yuan_name in (select yuan_name from A_TO_NOW group by yuan_name hav ...
- 解决import javafx.geometry.Point2D无法导入的问题
windows->preferences->java->compiler->errors/warning->deprecated and restricted API-& ...
- HDU 3086 马拉车模板
模板,但是对这个算法还是不太清楚,真实不明觉厉.... #include <iostream> #include <cstdio> #include <string.h& ...
- mysqldump mysql数据库导出命令
mysqldump -u用户名 -p密码 数据库名 > 导出的文件名 例如: mysqldump -uroot -p123456 test > /var/test.sql 如果要压缩就用管 ...
- loj6046 「雅礼集训 2017 Day8」爷
https://loj.ac/problem/6046 最近遇到几个分块题,我发现我一遇到分块题就死活构造不出来 不对,明明是,遇到数据结构题,就死活构造不出来. 所以我就找了几个分块题做做. 其实分 ...
- nslookup查不到数据
ch查不到数据 换一个ip就可以了,什么原理?