简介
为了简化空指针异常判断的代码书写
正常情况下
if (object !=null){
object2 = object.getMethod();//可能是null
if (obejct != null){
o3 = object2.method();//可能又是null
if ....
}
}
复制代码
为了简化书写并适应Lambda表达式 遂引入Optional
类
细节就不扣了,直接上手
源码不能丢
要素察觉
实例化Optional的方法
empty()
//创建空对象of(T value)
//创建非空对象ofNullable(T value)
//创建空或非空对象
空对象也是对象
返回Optional的方法
filter(Predicate<? super T> predicate)
//根据Predicate返回this或空对象map(Function<? super T, ? extends U> mapper)
//对非空value操作,并以其为参数构造Optional,再返回新的OptionalflatMap(Function<? super T, Optional<U>> mapper
//对非空this.value操作,再返回this
获取成员变量value的方法
get()
//经典get方法orElse(T other)
// 如果value为空返回,other。orElseGet(Supplier<? extends T> other)
// 返回非空this.value,否则返回被操作过的otherpublic <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
//返回非空value,否则抛出异常
功能性方法
boolean isPresent()
//判断value是否为空ifPresent(Consumer<? super T> consumer)
//操作非空value不返回值
测试
public class OptionalTest {
public static void main(String[] args) {
People people = new People("Kitty",18);
People people2 = new People("Google",30);
Optional<People> optional = Optional.of(people);//将对象people包装
optional.ifPresent( p -> p.setAge(20));//如果Optional非空,对p进行操作,p就是Optional的成员变量value
System.out.println(optional.flatMap(p -> {
p.setName("Jane");
return Optional.of(p);//flatMap要返回Optional
}).filter(p -> p.getAge() == 18).orElse(people2));
optional.ifPresent(System.out::println);
}
}
复制代码
解释
使用optional的注意点
Optional是基于值类型
Optional最基本使用
- 不被推荐的写法
if(optional.isPresent()){
各种骚操作
}
复制代码
- 推荐写法
optional.ifPresent(用Lambda表达式,进行各种骚操作);
复制代码
- Optional类的各种方法都有非空判断,随意使用
Optional是不可以序列化的
- 所以不能当成其他类的成员变量
- 所以不能成为方法参数,但返回值可以是它
总之,将对象丢进Optional中,防止空指针异常,顺便体验函数式编程
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END