jdk1.8 Optional 容器对象
- 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());
上一篇: HashMap原理