Optional的详细使用

一、使用

1.创建对象

  • 1.1 Optional类似是包装类,可以把具体的数据封装在其中,然后使用里面封装好的方法可以有效防止空指针
    一般通过Optional类中的ofNullable方法来把数据封装到Optional类
public class Test03 {
    public static void main(String[] args) {
        Author author = author();
        Optional<Author> author1 = Optional.ofNullable(author);
        author1.ifPresent(author2 -> System.out.println(author2.getName()));
        author1.ifPresent(author2 -> System.out.println(author2.getAge()));
        System.out.println(author1);
    }
    public static Author author(){
        Author author = new Author(1,"峰哥",25);
        return author;
    }
}

结果:
在这里插入图片描述

  • 1.2 如果一个值确定不为空的情况下,可以使用Optional类中的of方法来把数据封装到Optional类(有bug,可以传个空试试)
Optional<Object> o = Optional.of(null);
        System.out.println(o);

结果:
在这里插入图片描述

  • 1.3 当判断发现某个计算返回值为null时,需要把null值封装成Optional对象返回,可以采用Optional类中的empty方法
 public static Optional<Author> getAuthor(){
        Author author = new Author(1,"峰哥",25);
        return author==null?Optional.empty():Optional.of(author);
    }
     Optional<Author> author2 = getAuthor();
     author2.ifPresent(s-> System.out.println(s.getName()));

结果:输出“峰哥”两字

2.安全消费

当获到一个Optional对象后需要对其中进行操作,可以通过Optional类中的ifPresent方法来消费其中的值

3.安全获取值

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

  • 3.1 orElseGet
    获取数据并且设置数据为空的默认值,如果不为空则获取其中的数据,如果为空则获取设置的默认数据
 public static Optional<Author> getAuthor1(){
        Author author = new Author(1,"慕言",25);
        return Optional.ofNullable(author);
    }
    Optional<Author> author1 = getAuthor1();
        Author author = author1.orElseGet(() -> new Author());
        System.out.println(author.getName());

结果:输出“慕言”两字

  • 3.2 orElseThrow
    获取数据,如果不为空则获取其中的数据,如果为空则根据传入的数据来创建异常的抛出
 public static Optional<Author> getAuthor1(){
        Author author = new Author(1,"慕言",25);
        return Optional.ofNullable(author);
    }
     Optional<Author> author1 = getAuthor1();
        try {
            Author author = author1.orElseThrow( () -> new RuntimeException("数据为空"));
            System.out.println(author);
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }

结果:
在这里插入图片描述

4.过滤

可以通过filter方法对数据进行过滤,如果原本有数据,但不满足判断的,则会变成一个无数据的Optional对象

 public static void main(String[] args) {
  testFilter();
  }
  private static void testFilter() {
        Optional<Author> author1 = getAuthor1();
        author1.filter(author -> author.getAge() > 18).ifPresent(author -> System.out.println(author.getName()));
    }
    public static Optional<Author> getAuthor1(){
        Author author = new Author(1,"慕言",25);
        return Optional.ofNullable(author);
    }

结果:输出“慕言”两字

5.判断

可以通过isPresent判断数据是否存在

public static void main(String[] args) {
  testFilter();
  }
  private static void testFilter() {
        Optional<Author> author1 = getAuthor1();
        if (author1.isPresent()) {
            System.out.println(author1.get().getName());
        }
         public static Optional<Author> getAuthor1(){
        Author author = new Author(1,"慕言",25);
        return Optional.ofNullable(author);
    }

结果:输出“慕言”两字

总结

1.orElse 和 orElseGet 方法区别:

orElse 方法:无论 value 是否为null,都会执行 orElse 里的方法
orElseGet 方法:只有 value=null 时,才会执行 orElseGet 里的方法
建议平时使用 orElseGet 方法,少用 orElse 方法!

2.map 和 flatMap 方法区别:

map 方法: map: 判断 value 是否为null ,value为null,则返回 Optional.EMPTY 常量 ; value不为null,则返回 Optional包装结果
flatMap 方法:value为null,返回值同 map方法; value不为null,则返回入参的Optional包装参数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值