欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDK8新特性——Optional工具类

程序员文章站 2022-01-15 12:00:34
...

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( () -> new IllegalArgumentException());
    

    ​ 这个方法用于在对象为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 = new User())
    
相关标签: 学习笔记 java