聊聊JDK8之Optional解决NullPointerException

1 篇文章 0 订阅
1 篇文章 0 订阅

    老早以前就听说过Optional可以解决开发过程中的空指针异常,中途看过几篇博客,但一直没有下手的勇气。5月底公司有个新项目开展,技术栈更新了许多,再加上看见新公司同事用到了JDK8的stream流操作集合,心里也痒痒,就拿Optional来开刀了。中途也遇到了几个小小的坑,记录下来仅供参考。

    主要参考这位大佬的博客:【原创】JAVA8之妙用Optional解决NPE问题


    原先输出省市区的区域名称的写法:

        //获取省市区的区域
        if (province != null) {
            City city = province.getCity();
            if (city != null) {
                Area area = city.getArea();
                if (area != null) {
                    System.out.println(area.getName());
                }
            }
        }

1.不会用瞎用Optional

    以为包装个Optional就万事大吉,于是我有了下面的写法:

Province province = null;
System.out.println(Optional.ofNullable(province.getCity().getArea().getName()));

    空指针异常......尴尬......

2.不会用乱用Optional导致实体类要改变

    参照网上一篇博客给的用法:实体类中的属性全部加上Optional<..>修饰:

//实体类定义
public class Province {
    private Optional<City> city;
}    
public class City {               
    private Optional<Area> area;  
}
public class Area {
    private Optional<String> name;
}    

//方法输出....
System.out.println(Optional.ofNullable(province)
                .flatMap(p -> p.getCity())
                .flatMap(c -> c.getArea())
                .flatMap(a -> a.getName()));

    这样的虽然把区域名称打印出来了,但也改变了实体类属性的修饰,导致转json字段为空,数据库类型不匹配.....等等一系列问题,放弃了......

3.正确写法

    还是参考了上面大佬的博客,最终写法:

        System.out.println(Optional.ofNullable(province)
                .map(p -> p.getCity())
                .map(c -> c.getArea())
                .map(a -> a.getName()));

        //更精简
        System.out.println(Optional.ofNullable(province)
                .map(Province::getCity)
                .map(City::getArea)
                .map(Area::getName));

这里只讲了Optional使用的一些坑,还有其他用法,网上一堆,我就不列了。

一开始学习optional,lambda,stream总以为是洪水猛兽,不敢用。但这两个月项目用下来,感觉还是:得先迈出那一步,才知道,so easy 啦~

完~

JDK 8引入了一个重要的新特性,即Optional类。Optional类是一个容器对象,它可能包含null值,也可能包含非null值。使用Optional类可以避免空指针异常的发生,并提供了一种更优雅的方式来处理可能为空的值。 Optional类的主要作用是封装一个可能为null的值,并提供一些方法来处理这个值。通过使用Optional类,我们可以在代码中明确地表示一个值可能为空,并在使用这个值时采取相应的处理措施。 下面是一些Optional类的常见用法示例: 1. 创建一个Optional对象: ```java Optional<String> optional = Optional.of("value"); ``` 这里使用`Optional.of()`方法创建一个包含非null值的Optional对象。 2. 检查Optional对象是否包含值: ```java optional.isPresent(); // 返回true,表示Optional对象包含值 ``` 通过`isPresent()`方法可以判断Optional对象是否包含值。 3. 获取Optional对象中的值: ```java optional.get(); // 返回"value" ``` 使用`get()`方法可以获取Optional对象中的值。需要注意的是,如果Optional对象为空,调用`get()`方法会抛出NoSuchElementException异常。 4. 处理Optional对象为空的情况: ```java optional.orElse("default"); // 如果Optional对象为空,返回"default" ``` 使用`orElse()`方法可以指定当Optional对象为空时返回的默认值。 5. 使用Lambda表达式处理Optional对象: ```java optional.ifPresent(value -> System.out.println(value)); ``` `ifPresent()`方法接受一个Lambda表达式作为参数,当Optional对象包含值时,执行Lambda表达式中的逻辑。 以上是Optional类的一些常见用法,使用Optional类可以更加安全地处理可能为空的值,避免空指针异常的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值