在之前介绍过8的lambda表达式,分为3个章节进行了介绍,如下
JAVA8-lambda表达式1
JAVA8-lambda表达式2-集合类api
JAVA8-lambda表达式-并行流,提升效率的利器?
但是对一些常用的工具类,没有仔细介绍,后续会对涉及到逐个介绍,或者是一些最佳实践
实际的生产代码样例1,条件判断某一个对象是否为空,如果不为空则对它进行操作
npe异常几乎会伴随着Java程序员的一生,我们必须时时刻刻提防它的出现。所以很多时候,都必须进行空判断,所以代码里面会出现很null != XX的代码出现,而且这个几乎也无法消除,你不判断,就有可能出现npe。
不知道有没有感觉到,这种代码其实很看起来很烦,最关键的是必须小心翼翼,不然就报错了。如果是多层取值,这种更是如此,比如:
if (null != response) {
if (null != response.getCardPromotionPrize()) {
if (null != response.getCardPromotionPrize().getCustomInfo()) {
String key = response.getCardPromotionPrize().getCustomInfo().get("test_key");
if (null != key && !"".equals(key)) {
String targetKey = key;
// 其它业务逻辑
}
}
}
}
上面代码就是为了取一个key值,但是不得不得层层判断,到处都是null。
当然上面的代码可以用卫语句改造,看起来会稍微清晰一些
if (null == response) {
return;
}
if (null == response.getCardPromotionPrize()) {
return;
}
if (null != response.getCardPromotionPrize().getCustomInfo()) {
return;
}
String key = response.getCardPromotionPrize().getCustomInfo().get("test_key");
if (null != key && !"".equals(key)) {
String targetKey = key;
// 其它业务逻辑
}
但是这个不是重点,Java8提供了Optional带来了处理null的新方式
不仅我们对null有不满,连发明这null这一概念的的 Tony Hoare 也是如此, 他曾说这是自己的一个“ 价值连城的错误”。 作为一名有影响力的计算机科学家就是这样: 虽然连一毛钱也见不到, 却也可以犯一个“ 价值连城的错误”。(这句话是翻译过来的,哈哈)
Optional 是为核心类库新设计的一个数据类型, 用来替换 null 值。用null的最大问题是很容易出现npe,而Optional有2个好处:
创建一个Optional对象
可以通过工厂方法of
Optional a = Optional.of("a");
Optional相当于值的容器,又可以通过get获取从Optional获取该值
a.get()
Optional可能为空
要注意一点,Optional也可能为空,比如下面这个例子
CardPromotionPublishResponse response = new CardPromotionPublishResponse();
Optional.of(response.getCardPromotionPrize()).get();
运行上面这串代码,会报npe。究其原因,看下源码,是get方法不能允许value为空,也就是Optional不能为空
正确姿势
对于Optional的正确用法,一般是推荐是用另外一个工厂方法ofNullable 则可将一个空值转换成 Optional 对象,并且在调用 get() 方法前, 先使用 isPresent 检查 Optional对象是否有值。
CardPromotionPublishResponse response = new CardPromotionPublishResponse();
Optional.ofNullable(response.getCardPromotionPrize()).ifPresent(cardPromotionPrize -> {
});
运行一下,程序正常
Optional不为空最佳实践
使用Optional除了上面的工程方法ofNullable外,还有一个工厂方法empty
Optional emptyOptional = Optional.empty();
Optional alsoEmpty = Optional.ofNullable(null);
还有一种方法就是用orElse或者orElseGet,在为空的情况下,取默认值
CardPromotionPublishResponse response = new CardPromotionPublishResponse();
CardPromotionPrize backUp = new CardPromotionPrize();
CardPromotionPrize cardPromotionPrize = Optional.ofNullable(response.getCardPromotionPrize()).orElseGet(CardPromotionPrize::new);
cardPromotionPrize = Optional.ofNullable(response.getCardPromotionPrize()).orElse(backUp);
在代码中,找到为null的判断,并且用Optional替换它,用起来!