Java基础之1.8---Optional 类

空指针异常在java中是最常见也是最恶心的一种异常,这个时候就时候Java展现了自己有容乃大的气度,就去借鉴了Google著名的项目Guava,其中引入了Optional类,所Java也就大气的借鉴了(开玩笑)。

Optional 类(java.util.Optional)的引入很好的解决空指针异常。

Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样就不用显式进行空值检测。

Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

说实话如果在上面的理论,我也懵逼,所以理论先复制黏贴,然后看代码理解。而这个目前更是侧重于用。

类方法

首先先看其拥有的方法,

创建Optional 类对象的方法

方法 作用
Optional.of(T t) 创建一个Optiona实例,t不能是null。
Optional empty() 创建一个空Optiona实例。
Optional.ofNullable(T t) 创建一个Optiona实例,t可以是null。

判断Optional容器是否包含对象

方法 作用
boolean isPresent() 判断是否含有对象
void ifPresent(Consumer<? super T> consumer) 如果优质就执行consumer接口实现的代码,并且该值会作为参数传给它

获取Optional容器对象

方法 作用
T get() 如果调用对象包含值,返回该值,否则抛出异常
T orElse(T t) 如果有值则将其返回,否则返回指定的other对象
T orElseGet(Supplier< ? extends T> other) 如果有值则将其返回,否则返回指定的由Supplier接口实现的对象对象

代码演示

其实对于这个类,更侧重是对其使用,所以用代码将上面的方法进行简单的演示。

首先先声明一个自定义类

class person{
    
    
    String name;

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public person(String name) {
    
    
        this.name = name;
    }
        @Override
    public String toString() {
    
    
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }
}

下面的代码演示都是依托于上面的对象类进行操作的。

首先举出一个会报空指针异常。

        Person person= new Person("张三");
        System.out.println(person.getName());
//        但是有时候在程序中就会出一种可能,那就是声明的对象可能会为空
        person= null;
        System.out.println(person.getName());

在这里插入图片描述

optional类演示

创建optional类

       //  of 方法
        Person person= new Person("张三");
        Optional op =Optional.of(person);
        op =Optional.of(person);
        System.out.println(op);  //Optional[test1.Person@4b67cf4d]
        person= null;
        op =Optional.of(person); //Exception in thread "main" java.lang.NullPointerException

          //  empty 方法
        Person person= new Person("张三");
        Optional op =Optional.of(person);
        op =Optional.of(person);
        System.out.println(op); //Optional[test1.Person@4b67cf4d]
        op =Optional.empty();
        System.out.println(op);// Optional.empty

         //  ofNullable 方法  这看结果可以看出是 有点像是上面两种的结合   所以这个是最常见的创建Optional类
        Person person= new Person("张三");
        Optional op =Optional.of(person);
        op =Optional.of(person);
        System.out.println(op);  //Optional[test1.Person@4b67cf4d]
        person= null;
        op =Optional.ofNullable(person);
        System.out.println(op); //Optional.empty


判断容器是否包含对象

        //  isPresent 方法
        Person person= new Person("张三");
        Optional op =Optional.of(person);
        op =Optional.of(person);
        System.out.println(op.isPresent());  //true
        person= null;
        op =Optional.ofNullable(person);
        System.out.println(op.isPresent()); //false



  //  isPresent 方法
        Person person= new Person("张三");
        Optional op =Optional.of(person);
        op =Optional.of(person);
//  因为op这个地方不为空所以无法运行参数方法
        op.ifPresent(t->System.out.println("这个为空") );
        person= null;
        op =Optional.ofNullable(person);
        op.ifPresent(t->System.out.println("这个为空") );//  这个为空


获取对象

        // get 方法  
        Person person= new Person("张三");
        Optional op =Optional.of(person);
        op =Optional.of(person);
        System.out.println(op.get());//Person{name='张三'}

        person= null;
        op =Optional.ofNullable(person);
        System.out.println(op.get());//Exception in thread "main" java.util.NoSuchElementException: No value present


所以上面的代码需要进行一下修改,才不可能报错:

        Person person= new Person("张三");
        Optional op =Optional.of(person);
        op =Optional.of(person);
       if(op.isPresent()){
    
    
           System.out.println(op.get());//Person{name='张三'}
       }
        

如果只是这样的话,添加了一个判断语句,那我再

        Person person= new Person("张三");
        System.out.println(person.getName());
//        但是有时候在程序中就会出一种可能,那就是声明的对象可能会为空
        person= null;
        if(person!=null){
    
    
            System.out.println(person.getName());
        }

如果只是简单的这个那就没有多少意思,毕竟一个类的出现是为了更加方便或者是对以前繁琐代码的优化。继续写几行代码演示。

       //orElse方法
       Person person= new Person("张三");
        Optional<Person> op =Optional.ofNullable(person);
        Person person1=op.orElse(new Person("李四1"));
        System.out.println(person1.getName());//张三

        person= null; //如果使用 person=new Person(); //对象值为:Person{name='null'}
        op =Optional.ofNullable(person);
        person1=op.orElse(new Person("李四2"));
        System.out.println(person1.getName());//李四2
       


      


     // 用对象判断if 判断也行 

        Person person= new Person("张三");
        System.out.println(person.getName());
//        但是有时候在程序中就会出一种可能,那就是声明的对象可能会为空
        person= null;
        if(person!=null){
    
    
            person=new Person("李四2");
        }
        System.out.println(person.getName());


      //orElseGet 方法  (下面if对象的写法就不在演示)
        Person person= new Person("张三");
        Optional<Person> op =Optional.ofNullable(person);
        Person person1=op.orElseGet(()-> new Person("李四1"));
        System.out.println(person1.getName()); //张三

        person= null; //如果使用 person=new Person(); //对象值为:Person{name='null'}
        op =Optional.ofNullable(person);
        person1=op.orElseGet(()-> new Person("李四2"));
        System.out.println(person1.getName());//李四2

个人感觉:

整体用完,个人感觉这个类出现的单独使用的话个人感觉有点鸡肋,其存在的最大意义个人觉得的为Strean服务。不过再具体深入的话,本人就没有过多的深入研究了。

猜你喜欢

转载自blog.csdn.net/u011863822/article/details/121534453