Java防止NullPointerException神器-Optional

177 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

简介

Optional是jdk1.8后新增的一个类,用于优雅判断null,防止NullPointerException的一个神器。

tempImage1633680566134.jpeg

使用

新建一个Optional对象

// 创建一个空的Optional

Optional<User> emptyOptional = Optional.empty();

// 创建一个有值的Optional对象,如果为null,则抛出NullPointerException异常

Optional<User> userOptional = Optional.of(User.builder().build());

// 传入一个值创建一个Optional对象,若值为空,返回一个空的Optional对象

Optional<User> optionalUser = Optional.ofNullable(User.builder().build());

查看Optional对象有没有值

// 存在值返回true,不存在返回false

if (userOptional.isPresent()) {

    // TODO: 2021/10/8 业务逻辑

}

获取Optional对象的值

// 一般使用此方法前先判断该对象不为空后使用,由于此对象为null时,贼抛出NoSuchElementException

if (userOptional.isPresent()) {

    User user = userOptional.get();

}

// 如果Optional对象存在值返回此对象的值,否则返回新的User

User user = userOptional.orElse(User.builder().build());

// 如果Optional对象存在值返回此对象的值,否则执行getUser方法

User user = userOptional.orElseGet(Test::getUser);

// 当对象存在值时返回值,否则抛出异常

userOptional.orElseThrow(() -> new IllegalArgumentException("值不存在"));

当Optional对象有值时执行方法

// 当optionalUser有值执行test方法

optionalUser.ifPresent(Test::test);

高级用法

过滤值

Optional<String> stringOptional = Optional.ofNullable("xxxxx");

// 如果长度大于3,返回值为xxxxx 的Optional对象,否则返回空的Optional对象

Optional<String> stringOptional1 = stringOptional.filter(s -> s.length() > 3);

修改Optional的值

Optional<User> optionalUser = userOptional.map(user -> {
    user.setName("12");
    return user;
});

// flatMap与map的用法基本一致,唯一的区别就是返回的时候需要手动使用Optional包装一下,而map不需要

Optional<User> user1 = userOptional.flatMap(user -> {
    user.setName("1234");
    return Optional.of(user);
});

总结

用好Optional方法,可以在项目中减少大量null的判断,不再需要通过if (user != null)的方式来进行判断对象是否为null,更加优雅的写出合格的代码。一键三连是对博主最大的肯定。

tempImage1633680519241.gif