java的optional的使用

324 阅读2分钟

「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战」。

开发中最常见的异常是什么呢?NullPointerException。我不知道各位大佬的情况,我自己见过最多的就是此僚。那么Optianl是啥呢,号称java8出现的3个划时代的新东西,就是为了解决NPE(NullPointerException)问题,也可以配合lambda表达式进行链式操作。

@Data
public class Dog {
    private String name;
}

定义了一个类代表狗狗,有一个属性name。现在给了一只狗,要获取它的名字。直接dog.getName()不就行了?万一是买到了只假的狗,上当了,是null呢,直接NPE,那我们怎么处理呢。

public static String getNameOld(Dog dog){
    if (dog==null){
        return null;
    }
    return dog.getName();
}

写个方法,判断下是不是空,然后获取。这个判断null是不是比较讨厌,如果我不想这样判断,怎么办?

public static String getNameNew(Dog dog){
    return  Optional.ofNullable(dog).map(Dog::getName).orElse(null);
}
//此处为调用上述方法
Dog dog = new Dog();
dog.setName("旺旺");
dog = null;
System.out.println(getNameOld(dog));
System.out.println(getNameNew(dog));

使用optional。这里先是使用了Optional的ofNullable方法创建了一个optional对象,之后使用map方法,返回一个optional,如果狗不是空的,map方法返回的optional的value就不是空的(即狗的名字),否则optional的value是空的。在调用orElse获取值,如果这个optional的value不为空,返回value,否则null。(注意这里是创建了两个optional)

optional如何创建(我的jdk版本是14),使用of或者ofNullable方法。两者的区别是一个不允许为空,一个允许为空。

image.png

我个人觉得比较常用有如下方法: 1.map方法(与faltMap的区别是map会创建一个optional对象,flatMap执行函数表达式后要求结果必须为optional)。

2.ifPresert方法。如果optional的value不为空,调用consumer.accpet。可以用于替代判断某个值为空时执行某个操作。java9新增了一个ifPresetOrElse。

//判断某个对象是否为空,不为空执行一个操作,为空执行另一个操作。
Object a = new Object();
Optional.ofNullable(a).ifPresentOrElse(it->System.out.println("a"),()->System.out.println("b"));

java9新增了or,ifPresent和stream方法。之后的10版本和11版本都有增加新方法。具体可以直接看源码。如有问题,请大佬们多多指正。