optional

什么是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没有值时

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值