Java基础学习总结2——Optional类

Java-Optional类


前言

Optional 对象是一种包装器对象,要么包装了类型T的对象,要么没有包装任何对象。

使用Optional主要是帮我们解决最烦人的NPE问题,相信大家在写代码过程中为了防止NPE一定用过很多的If 语句进行判断,而Optional类的出现就是为了帮我们更优雅的解决这类问题,提高代码的可读性。


一、Optional类是什么?

Optional主要是为了帮助我们解决npe问题,很多地方都会推荐我们使用Optional类来解决空指针异常的问题,我们通常的做法就是用if语句去判断是否为空,然后抛异常或是其他处理,而Optional可以帮我们更优雅的去做非空检查。

常用Optional api

二、Optional常用api

1. empty

返回一个空的Optional实例。 此可选项不存在值。实际过程中用的很少

  public static void empty() {
        Optional<Object> empty = Optional.empty();
        Optional<License> license = Optional.empty();
        System.out.println(empty);
        System.out.println(license);
        // 输出都是 Optional.empty
    }

2. of

返回具有 Optional的当前非空值的Optional。 如果为空,直接抛出异常

 public static void of() {
        License license = new License();
        license.setId(1);
        Optional<Integer> id = Optional.of(license.getId());
        System.out.println(id);
    }
    // 输出 Optional[1] 注释掉setId()的情况直接抛异常

3. ofNullable

返回一个 Optional指定值的Optional,如果非空,则返回一个空的 Optional 。

4. get

如果 Optional中存在值,则返回值,否则抛出 NoSuchElementException 。

没有值存在抛出异常 NoSuchElementException

5. isPresent

public boolean isPresent()如果存在值,则返回 true ,否则为 false 。

6. ifPresent

public void ifPresent(Consumer<? super T> consumer)如果存在值,则使用该值调用指定的消费者,否则不执行任何操作。

7. filter

public Optional filter(Predicate<? super T> predicate)如果一个值存在,并且该值给定的谓词相匹配时,返回一个 Optional描述的值,否则返回一个空的 Optional 。

8. map

public Optional map(Function<? super T,? extends U> mapper)如果存在值,则应用提供的映射函数,如果结果不为空,则返回一个Optional结果的Optional 。 否则返回一个空的Optional 。

9. flatMap

public Optional flatMap(Function<? super T,Optional> mapper)如果一个值存在,应用提供的Optional映射函数给它,返回该结果,否则返回一个空的Optional 。 这种方法类似于map(Function) ,但是提供的映射器是一个结果已经是Optional映射器,如果被调用, flatMap不会用额外的Optional 。

10. orElse

public T orElse(T other)返回值如果存在,否则返回 other 。

11. orElseGet

public T orElseGet(Supplier<? extends T> other)返回值(如果存在),否则调用 other并返回该调用的结果。

12. orElseThrow

public T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X extends Throwable
返回包含的值(如果存在),否则抛出由提供的供应商创建的异常。

 public static void orElseThrow() {
        License license = new License();
        license.setId(123);
        license.setLicenseCount(100);
        license.setBusiness("ActiveCount");
        Integer id = Optional.ofNullable(license.getId()).
        orElseThrow(() -> new ServiceException("id不能为空"));
        String business = Optional.ofNullable(license.getBusiness()).
        filter(s -> !s.isEmpty()).
        orElseThrow(() -> new ServiceException("业务类型不能为空"));
        Integer licenseCount = Optional.ofNullable(license.getLicenseCount()).
        orElseThrow(() -> new ServiceException("license数量不能为空"));
        System.out.println(id);
        System.out.println(business);
        System.out.println(licenseCount);
    }

总结

orElseThrow是本人目前用的最多的,建议只用Optional在返回值的情况,其他的方法也很灵活,比如map和flatmap等。
注意点:

1. 不要将null赋给Optional

2. 避免使用Optional.get()。如果你不能证明存在可选项,那么永远不要调用get()。

3. 不要在字段,方法参数,集合中使用Optional。

4. 只有当结果不确定时,使用Optional作为返回类型。

5. 永远都不适用optional作为键,值或者集合或数组中的元素

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值