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

jdk1.8 Optional 容器对象

程序员文章站 2022-06-04 19:24:10
...
  • Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
  • Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
  • Optional 类的引入很好的解决空指针异常。

常用方法:

方法名 解释
Optional.of(T t) 创建一个Optional实例
Optional.empty() 创建一个空的Optional实例
Optional.ofNullable(T t) T == null?empty():of(T t)
isPresent() 判断是否包含值
orElse(T t) 如果调用对象包含值,则返回该值,否则返回T
orElseGet(Supplier s) 如果调用对象包含值,返回该值,反则反回s获取的值
map(Function f) 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
FlatMap(Function mapper) 与map 类似,要求返回值必须是Optional

**

Optional.of(T t)

创建一个Optional实例

**

    @Test
    public void test1(){
        Optional<Person> person = Optional.of(new Person());
        Person person1 = person.get();
        System.out.println(person1);
    }

执行结果:

Person{id=0, name=‘null’, age=null, salary=0.0, status=null}


**

Optional.empty()

创建一个空的Optional实例

**

    @Test
    public void test2(){
        Optional<Person> person = Optional.empty();
        Person person1 = person.get();
        System.out.println(person1);
    }

执行结果:

java.util.NoSuchElementException: No value present

at java.util.Optional.get(Optional.java:135)
at Optional.TestOptional.test2(TestOptional.java:27) ←元素为空异常
…省略

在此可以看到 java.util.NoSuchElementException 异常
那为啥 Optional 这个类就是解决 null 异常的,结果现在的确不爆空指针异常,而是显示没有这样的元素?
那是因为这个可以更准确的找出哪里为 null ,null 没办法避免,这不像以前那样出现异常后要找半天了


**

Optional.ofNullable(T t)

T == null?empty():of(T t)

**
我们可以看源码:

    public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }

ofNullable()就是empty()和of的结合
如果不知道是否有值那就使用ofNullable(),


**

isPresent()

判断是否包含值
null 返回 false
notNull 返回 true

**

Optional<Person> person = Optional.ofNullable(null);
if(person.isPresent()){ //false
    Person person1 = person.get();
    System.out.println(person1);
}

**

orElse(T t)

如果调用对象包含值,则返回该值,否则返回T

**

public void test3(){
        Optional<Person> op = Optional.ofNullable(new Person());
        Person person1 = op.orElse(new Person("王刚", 123, 23.432, Person.Status.BUSY));
        System.out.println(person1);

        Optional<Person> op1 = Optional.ofNullable(null);
        Person person2 = op1.orElse(new Person("王刚", 123, 23.432, Person.Status.BUSY));
        System.out.println(person2);
}

执行结果:

Person{id=0, name=‘null’, age=null, salary=0.0, status=null}
Person{id=0, name=‘王刚’, age=123, salary=23.432, status=BUSY}

可以看到ofNullable(T)之后,如果T为空,调用orElse(T1)的时候T1将会替换T并且返回一个对象


**

orElseGet(Supplier s)

如果调用对象包含值,返回该值,反则反回s获取的值

**

        Optional<Person> op = Optional.ofNullable(null);
        Person person = op.orElseGet(Person::new);
        System.out.println(person);
        
		Optional<Person> op1 = Optional.ofNullable(new Person("王刚", 123, 23.432, Person.Status.BUSY));
        Person person1 = op1.orElseGet(Person::new);
        System.out.println(person1);

执行结果:

Person{id=0, name=‘null’, age=null, salary=0.0, status=null}
Person{id=0, name=‘王刚’, age=123, salary=23.432, status=BUSY}

跟orElse差不多,但是orElseGet返回的东西更加复杂,可以写更多操作,比如if,else,分别返回不同的结果


**

map(Function f)

如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()

**

Optional<Person> op = Optional.ofNullable(new Person("王刚", 123, 23.432, Person.Status.BUSY));
Optional<String> s = op.map(e -> e.getName());
System.out.println(s.get());

执行结果:

王刚


**

FlatMap(Function mapper)

与map 类似,要求返回值必须是Optional

**

Optional<Person> op = Optional.ofNullable(new Person("王刚", 123, 23.432, Person.Status.BUSY));
Optional<String> s = op.flatMap(e -> Optional.ofNullable(e.getName()));
System.out.println(s.get());
相关标签: java java