什么是optional
Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException,空指针异常是导致Java应用程序失败的最常见原因,JDK8引入Optional类用来检查空值,它实际上是个容器,可以保存类型为T的值,或者仅仅保存null。
创建方式
- Optional.of(T value),返回一个Optional对象,value不能为空,否则会抛出空指针异常
- Optional.ofNullable(T value),返回一个Optional对象,value可以为空
- Optional.empty(),代表空
访问 Optional 对象的值
从 Optional 实例中取回实际值对象的方法之一是使用 get() 方法:
这个方法会在值为 null 的时候抛出异常。要避免异常,你可以选择首先验证是否有值:
User user = new User("john@gmail.com", "1234");
Optional<User> opt = Optional.ofNullable(user);
assertTrue(opt.isPresent());
assertEquals(user.getEmail(), opt.get().getEmail());
检查是否有值的另一个选择是 ifPresent() 方法。该方法除了执行检查,还接受一个Consumer(消费者) 参数,如果对象不是空的,就对执行传入的 Lambda 表达式:
opt.ifPresent( u -> assertEquals(user.getEmail(), u.getEmail()));
常见API
- optional.isPresent(),是否存在值
- optional.ifPresent(Consumer<? super T> consumer),如果存在值则执行consumer
- optional.get(),获取value
- optional.orElse(T other),如果没值则返回other
- optional.orElseGet(Supplier <? extends T> other),如果没值则执行ohter并返回
- optional.orElseThrow(Supplier <? extends X> exceptionSupplier),如果没值则执行exceptionSupplier,并抛出异常
- optional.map(Function <? super T, ? extends U> mapper),映射,映射规则由Function指定,返回映射值的Optional,所以可以继续使用Optional的API
- optional.filter(Function <? super T> predicate),过滤,按指定规则过滤,不符合的返回empty
示例
@RunWith(SpringJUnit4ClassRunner.class)
@Slf4j
public class testOptional {
@Test
public void testOptional() {
HolidayEntity holidayEntity = new HolidayEntity();
holidayEntity.setId(1L)
.setYear(2022)
.setHolidayType(1);
Integer year = getYear(holidayEntity);
System.out.println(year);
}
public Integer getYear(HolidayEntity holidayEntity) {
return Optional.ofNullable(holidayEntity).map(holidayEntity1 -> holidayEntity1.year).orElse(null);
}
}
当holidayEntity没有值时
当holidayEntity有值,但是year没有值时