Optional的使用

目录

 一,Optional对象

1.1 概述

二,Optional的使用

2.1 创建对象

2.2 安全消费值

2.3 获取值

2.4 安全获取值

orElseGet

orElseThrow

2.5 过滤

2.6 判断

2.7 数据转换


有关Stream流及函数式编程的相关代码均在我的码云上查看:徐明园/JavaCode - Gitee.com

并内附了详细的Stream流README文档:

 一,Optional对象

1.1 概述

我们在编写代码的时候出现最多的就是空指针异常。所以在很多情况下我们需要做各种非空的判断。
Author author = getAuthor();
if(author!=null){
    System.out.println(author.getName());
}
尤其是对象中的属性还是一个对象的情况下。这种判断会更多。而过多的判断语句会让我们的代码显得臃肿不堪。所以在JDK8中引入了 Optional, 养成使用 Optional的习惯后你可以写出更优雅的代码来避免空指针异常。 并且在很多函数式编程相关的 API 中也都用到了 Optional ,如果不会使用 Optional 也会对函数式编程的学 习造成影响。

二,Optional的使用

2.1 创建对象

Optional 就好像是包装类,可以把我们的具体数据封装 Optional 对象内部。然后我们去使用 Optional 中封装好的方法操作封装进去的数据就可以非常优雅的避免空指针异常。
  • 无法确定对象是否未空:使用Optional的静态方法ofNullable来把数据封装成一个Optional对象
Author author = getAuthor();
Optional<Author> authorOptional = Optional.ofNullable(author);
  • 可以确定一个对象不为空:使用Optional的静态方法of来把数据封装成Optional对象
Author author = new Author();
Optional<Author> authorOptional = Optional.of(author);

注意:最常用的方法还是->使用Optional的静态方法ofNullable来把数据封装成一个Optional对象

2.2 安全消费值

我们获取到一个 Optional 对象后肯定需要对其中的数据进行使用。这时候我们可以使用其 ifPresent 方法对来消费其中的值。这个方法会判断其内封装的数据是否为空,不为空时才会执行具体的消费代码。这样使用起来就更加安全了。
Optional<Author> authorOptional = Optional.ofNullable(getAuthor());
authorOptional.ifPresent(author -> System.out.println(author.getName()));

2.3 获取值

如果我们想获取值自己进行处理可以使用 get 方法获取,但是不推荐。因为当 Optional 内部的数据为空的时候会出现异常。所以一般采用2.4讲解的安全获取值。

2.4 安全获取值

如果我们期望安全的获取值。我们不推荐使用 get 方法,而是使用 Optional 提供的以下方法。

orElseGet

获取数据并且设置数据为空时的默认值。如果数据不为空就能获取到该数据。如果为空则根据你传
入的参数来创建对象作为默认值返回。
Optional<Author> authorOptional = Optional.ofNullable(getAuthor());
Author author1 = authorOptional.orElseGet(() -> new Author());

orElseThrow

获取数据,如果数据不为空就能获取到该数据。如果为空则根据你传入的参数来创建异常抛出。
Optional<Author> authorOptional = Optional.ofNullable(getAuthor());
try {
    Author author = authorOptional.orElseThrow((Supplier<Throwable>)
() -> new RuntimeException("author为空"));
    System.out.println(author.getName());
} catch (Throwable throwable) {
    throwable.printStackTrace();
}

2.5 过滤

我们可以使用 filter 方法对数据进行过滤。如果原本是有数据的,但是不符合判断,也会变成一个无数据的Optional 对象。
Optional<Author> authorOptional = Optional.ofNullable(getAuthor());
authorOptional.filter(author -> author.getAge()>100).ifPresent(author ->
                      System.out.println(author.getName()));

2.6 判断

我们可以使用 isPresent 方法进行是否存在数据的判断。如果为空返回值为 false, 如果不为空,返回值为true。但是这种方式并不能体现 Optional 的好处, 更推荐使用 ifPresent 方法
Optional<Author> authorOptional = Optional.ofNullable(getAuthor());
if (authorOptional.isPresent()) {
    System.out.println(authorOptional.get().getName());
}

2.7 数据转换

Optional 还提供了 map 可以让我们的对数据进行转换,并且转换得到的数据也还是被 Optional 包装好的,保证了我们的使用安全。
//获取作家的书籍集合。
Optional<Author> authorOptional = getAuthorOptional();
Optional<List<Book>> optionalBooks = authorOptional.map(author ->author.getBooks());
optionalBooks.ifPresent(books -> System.out.println(books));

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值