JDK8.0相关特性-Optional类(四)

JDK8.0相关特性

七、Optional类

  • Optional 类:位于java.util.Optional包中,是一个容器类,代表一个值存在或是不存在(之前利用null表示一个值是否存在,JDK8.0开始利用Optional类更好的表达式一个值是否存在)。同时可以避免空指针异常

  • 利用Optional类中的静态方法,获取Optional对象:

    • of(T value):创建非空置,如果value为空,则抛出NullPointException异常
    • empty():创建空值
    • ofNullable(T value):创建Optional对象,允许null值
  • 访问Optional对象

    • get():获取值,如果空值则抛出异常,异常信息为:

      ​ java.util.NoSuchElementException

    • isPresent():判断值是否存在

    • orElse(T value):获取值,如果无值则取默认值

    • orElseGet(Supplier s):带有逻辑,获取值

    • ifPresent(Consumer c):如果值存在,则消费值

    • map(Function f):将输入转换为另一种形式进行输出

    //获取Optional的三种方式
    Optional<Student> o=Optional.of(new Student());//创建非空值
    System.out.println(o.get());
    
    Optional<Student> o2=Optional.empty();//创建空值
    System.out.println(o2.get());
    
    Optional<Student> o3=Optional.ofNullable(null);//允许null值
    System.out.println(o3.get());
    
    //操作Optional对象
    if(o3.isPresent()){
          
          
        System.out.println(o3.get());
    }
            
    Student s=o3.orElse(
        new Student("张三",28, Student.Status.Study));
    System.out.println(s);
    
    //获取学生的姓名
    Student s2=new Student();
    Optional<Student> o4=Optional.of(s2);
    String name=o4.map((s5)->s5.getName()).orElse("no name");
    System.out.println(name);
    
    o4.ifPresent(System.out::println);//不为空,则消费数据
    
  • 注意事项:

    • Optional是一个final类,未实现任何接口,所有程序中利用Optional包装定义类的属性时,如果定义的类有对象序列化的需求,由于Optional类没有实现Serializable接口,此时对象序列化操作会有问题:

      class User implements Serializable {
              
              
          private long id;
          private String name;
          private Optional<Long> phone;//不能对象序列化
      }
      //替换策略
      class User implements Serializable {
              
              
          private long id;
          private String name;
          private Long phone;//不能对象序列化
          public Optional<Long> getPhone(){
              
              
              return Optional.ofNullable(this.phone);
          }
      }
      
    • 本身只是一个容器类工具,普通方法跟简单的话,实际上是没必要使用的,不要为使用而使用了

猜你喜欢

转载自blog.csdn.net/Java_lover_zpark/article/details/90293309