JAVA8-lambda表达式之Optional

传送门

在之前介绍过8的lambda表达式,分为3个章节进行了介绍,如下

JAVA8-lambda表达式1

JAVA8-lambda表达式2-集合类api

JAVA8-lambda表达式-并行流,提升效率的利器?

但是对一些常用的工具类,没有仔细介绍,后续会对涉及到逐个介绍,或者是一些最佳实践

生产案例

实际的生产代码样例1,条件判断某一个对象是否为空,如果不为空则对它进行操作

NullPointerException

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

Optional 是为核心类库新设计的一个数据类型, 用来替换 null 值。用null的最大问题是很容易出现npe,而Optional有2个好处:

  • 鼓励程序员记得检查变量是否为空,避免出bug
  • 第2点,也是最重点的一点,不用在跟null打交道,可以安心的避免npe,并且一看代码就知道意图

基本用法

创建一个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不能为空

JAVA8-lambda表达式之Optional_第1张图片

正确姿势

对于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替换它,用起来!

你可能感兴趣的:(JAVA,不得不学,jdk源码之路)