小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
简介
Optional是jdk1.8后新增的一个类,用于优雅判断null,防止NullPointerException的一个神器。
使用
新建一个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,更加优雅的写出合格的代码。一键三连是对博主最大的肯定。