JDK8新特性Optional工具类

2022年10月29日11:16:55

JDK8新特性----玩转Optional工具类

1. 基本概念

Java 8 中引入了一个有趣的特性是Optional类,该工具类的引入主要是为了解决空指针异常(NullPointException)。本质上,这是一个包含有可选值的包装类,意味着类本身亦可以有值也可以为Null。

2.方法

方法 描述
of() 把指定的值封装成Optional对象并返回,如果参数为null,贼会抛出空指针异常(不可以传null值)
ofNullable() 把指定的值封装为Optional对象并返回,如果参数为null,则创建一个空的Optional对象(可以传null值)
empty() 创建一个空的Optional对象
get() 如果创建的Optional中有值存在,则返回此值,否则抛出NoSuchElementException
orElse() 如果创建的Optional中有值存在,则返回此值,否则返回一个默认值(即返回传入的参数)
orElseGet() 如果创建的Optional中有值存在,则返回此值,否则返回一个由Supplier接口(参数)生成的值
orElseThrow() 如果创建的Optional中有值存在,则返回此值,否则抛出一个由指定的Supplier(参数)接口生成的异常
filter() 如果创建的Optional中的值满足filter中的条件,则返回包含该值的Optional对象,否则返回一个空的Optional对象
map() 如果创建的Optional中有值存在,则应用提供的映射函数,如果结果不为空,则封装成Optional返回,否则返回一个空的Optional
flagMap() 如果创建的Optional中的值存在,就对该值执行提供的Function函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象
isPresent() 如果创建的Optional中的值存在,返回true,否则返回false
ifPresent() 如果创建的Optional中的值存在,则执行该方法的调用,否则什么也不做

3.方法详解

  1. of() 和 ofNullable()

    // 传入null值会抛出异常,所以参数必须确保非空
    Optional<String> op= Optional.of("Ye")
    // 为指定的值创建Optional对象,不管所传入的值为null不为null,创建的时候都不会报错
    Optional<String> nullOptional= Optional.ofNullable(null);
    Optional<String> nullOptional= Optional.ofNullable("Ye");

    当我们明确参数不为null时我们使用of(),否则我们应该使用ofNullable()来摆脱空指针异常都影响。

  2. empty

    // 创建一个为空的Optional对象
    Optional<String> emptyOptional= Optional.empty();
  3. get() | orElse() | orElseGet()

    1. get()

      // 获取Optional对象中封装的值
      String s= Optional.of("Value").get()// 当Optional对象封装的值为空的时候会抛出异常,所以一般可结合isPresent()使用
      Optional<String> op= Optional.ofNullable("Ye")if(op.isPresent()){
      	String name= op.get()}
    2. orElse() 和 orElseGet()

      // 当Optional对象中值为null时返回默认值,避免空指针异常的可能
      String name= Optional.ofNullable(name).ofElse("Ye")
      // 这个方法会在有值的时候返回值,如果没有值,它会执行作为参数传入的 Supplier(供应者) 函数式接口,并将返回其执行结果
      User result= Optional.ofNullable(user).orElseGet(()-> user2);

      当参数都为一个方法的时候,如果Optional中封装的值为null,则两方法无差异;当Optional封装的值不为null的时候,orElse()仍然会执行参数中方法,orElseGet()则不会。这个区别使得两者在性能上有所差异。

  4. orElseThrow()

    // 当Optional封装值为空的时候,会抛出你指定的异常
    User result= Optional.ofNullable(user).orElseThrow(()->newIllegalArgumentException());

    这个方法用于在对象为null时抛出我们想要的异常而非空指针,方便于定位和处理问题

  5. filter()

    // filter() 接受一个 Predicate 参数,返回测试结果为 true 的值。如果测试结果为 false,会返回一个空的 Optional。
    Optional<String> op= Optional.of(user).filter(()-> String.isNotEmpty(user.name))// 由于该方法返回的是Optional对象,这使得我们可以在一行代码中过滤符合指定条件的数据进行处理// 过滤出具有权限的user(或user为null也会返回true的方法),获取他们的值,如果为null则返回新user
    User user= Optional.ofNullable(user).filter(u-> u.permission()).orElseGet(creatNewUser())
  6. map() 和 flatMap()

    // 如果创建的Optional中的值存在,对该值进行操作返回结果(一般用来转换值或取得其中属性),返回的值为Optional,可执行链式编程(后接orElse()等)
    String userName= Optional.ofNullable(user).map(user-> user.getName()).orElse("姓名未填写")

    一般利用该方法进行封装值的转换和属性提取,避免了只能对原始类型Optional的操作和获取。

    // flatMap() 与 map()方法类似,但是参数Predicate返回的值必须是Optional,返回结果也不会进行封装
    String userName= Optional.ofNullable(user).flatMap(user-> Optional.ofNullable(user.getName()).orElse("姓名未填写")
  7. isPresent() 和 ifPresent()

    // isPresent()可用来对Optional判空,在Optation内部代码中实现判断逻辑
    Optional.ofNullable.isPresent()// ifPresent()用于简化if结合判空的使用,内部传入Predicate参数,只进行内部处理没有返回值
    Optional.ofNullable(user).ifPresent(()-> user=newUser())
  • 作者:Yava想要进大厂
  • 原文链接:https://blog.csdn.net/lunatic__/article/details/117093931
    更新时间:2022年10月29日11:16:55 ,共 2905 字。