java8中optional的使用

java8中optional的使用

​ 我们在写java代码中,尤其是业务代码,如果一个类的组合以及级联关系过多时,很容易造成空指针异常,如下面一个例子:

//人
public class Person {
    private Car car;

    public Car getCar() {
        return car;
    }
}

//车
public class Car {
    private Insurance insurance;

    public Insurance getInsurance() {
        return insurance;
    }
}
//保险
public class Insurance {
    private String name;

    public String getName() {
        return name;
    }
}

​ 上面是三个具有级联组合关系的类,如果我获取到一个person对象,此时想要获取此人的车的保险名称,如果是刚入门的程序员可能会这样写:

public String result(Person person){
        return person.getCar().getInsurance().getName();
    }

这样的话如果过程中任意一个对象Car或者Insurance为空的话,便会抛出烦人的空指针异常,然后进行下面的修改:

public String result(Person person) {
        if(person!=null){
            Car car = person.getCar();
            if(car!=null){
                Insurance insurance = car.getInsurance();
                if(insurance.getName()!=null){
                    return insurance.getName();
                }
            }
        }
        return null;
    }

以上进行了三次判空,这样的代码当然是完全没有问题的,但对于一个优秀的工程师来说总是希望自己的代码更加简洁高效,好在java8提供了这个一个辅助类Optional来帮助我们改善这一状况。

我们先来看Optional类的常见方法:

1.public static <T> Optional<T> of(T value)
静态方法,用于将一个value直接封装成optional类,注意value不能为空,否则会抛出空指针异常。

2.public static <T> Optional<T> ofNullable(T value)
静态方法,它与上面一个方法的却别就是可以接收一个空值,如果接收一个控制的话,返回是一个包含null的optional对象。

3.public T get()
获取optional中的值,如果optional里面的值为空的话,会抛出NoSuchElementException异常。

4.public boolean isPresent()
判断optional中的值是否为空,返回类型为boolean类型。

5.public void ifPresent(Consumer<? super T> consumer)
在变量值存在时执行一个作为参数传入的方法,否则不进行任何操作。

6.public Optional<T> filter(Predicate<? super T> predicate)
对optional中的值进行过滤。

7.public<U> Optional<U> map(Function<? super T, ? extends U> mapper)
如果optional里面的值不为空的话,执行函数式接口Function里面的方法后,如果值不为空,则返回包装了该值的optional对象,否则返回一个包装了null的optional对象。

8.public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)
此方法跟map的不同之处在于返回的结果已经经过optional包装。

9.public T orElse(T other)
如果optional中的值不为空的话返回该值,否则返回other。

10.public T orElseGet(Supplier<? extends T> other)
跟orElse基本类似,是orElse的延迟调用版,当optional里面的值为空时,则调用函数式接口Supplier,并作为返回值。

11.public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
当optional里面的值为空时,可以自己抛出异常。

理解了Optional的核心方法以后,我们来改造获取保险名称的例子:

public String result(Person person) {
        String result = Optional.ofNullable(person)
                .map(Person::getCar)
                .map(Car::getInsurance)
                .map(Insurance::getName)
                .orElse("null");
        return result;
    }

首先我们将person包装成为一个Optional对象,使用ofNullable方法,如果传入的person对象为空的话,便直接返回“nul”。否则的话进行正常的调用,如果过程中有任何一个对象为空的话,也直接返回“null”。

或者,你也可以抛出自定义异常,

public String result(Person person) throws Exception {
        String result = Optional.ofNullable(person)
                .map(Person::getCar)
                .map(Car::getInsurance)
                .map(Insurance::getName)
                .orElseThrow(() -> new Exception("参数错误"));
        return result;
    }

以上就是使用Optional来处理空指针异常的常见用法,当然Optional的用法远不止于此,Optional的filter方法也可以用来对一些数据进行过滤,使处理方式更加优雅。

以上就是对Optional类的简单介绍,快去改造你的代码吧,加油。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值