java8里提供的Optional类,简单来讲是个容器类,可以放任意类型对象,以及null,是在java.util包下的一个用于代替null的一个工具类。它的存在是为了解决空指针异常的问题,通过提供的isPresent()方法对放入的值进行是否存在的判断,以及一系列构建、过滤、值映射方法,和有备选方案的取值方法。
以往的编写代码中:
Person person =new Person();
if(person != null){
System.out.println(person.getPersonName());
}
过多的判断使代码显得臃肿不堪,所以在JDK8中引入了Optional,用于更优雅的规避空指针,很多函数式编程中也引入了Optional,所以有必要学习一下
1.1什么时候使用- 对于调用一个可能得到null值的方法得到的结果,通常需要使用if(null != xx){},代码很长,并且容易忘记,使用Optional并结合函数式编程风格使用后,可以用简短代码达到同样效果
- 对于提供给外部使用的返回值有可能为空的接口,返回类型可以使用Optional来定义,提醒使用方进行相应检查
Optional就像是包装类,我们可以把具体的数据封装到Optional内部,在使用Optional内部方法进行操作数据。
2.1.1 获取对象 empty( )、of( )、ofNullable( )查看下源码:
empty:创建一个空的Optional
of:参数不能空
说明:value不可以为null,否则会报空指针
ofNullable(推荐使用)
Person person =new Person();
Optional person1 = Optional.ofNullable(person);
person1.ifPresent(p -> System.out.println(p.getPersonName()));
2.2 安全消费 2.2.1 ifPresent()说明: 构建一个value的Optional对象
2.3 获取值 2.3.1 get(不推荐)说明: ifPresent传入一段lambda,当value!=null时,执行里面的逻辑;value==null时,啥都不干;
源代码:
2.3.2 orElseGet说明: 意思就是Optional中没有值 get的时候会抛出异常,所以不推荐使用。
Optional有值的话返回该值,没有值则会根据自己的传入指定一个默认值
源代码:
Person person =new Person();
person =null;
Optional person1 = Optional.ofNullable(person);
//new Person 为指定的默认值
Person person2 = person1.orElseGet(() -> new Person());
System.out.println(person2.getPersonName());
输出结果:
2.3.3 orElseThrow说明:即使对象是null 也不会有异常,会返回一个默认值
如果存在,则返回包含的值,否则抛出由提供的供应商创建的异常。
源代码:
Person person =new Person();
person =null;
Optional person1 = Optional.ofNullable(person);
Person person2 = person1.orElseThrow(() -> new RuntimeException("数据不存在"));
System.out.println(person2.getPersonName());
输出结果:
2.4 过滤 2.4.1 filter说明: 有值返回值,没值抛异常,可用于统一异常管理。
过滤数据
Person person =new Person();
person.setPersonName("zhangsan");
Optional person1 = Optional.ofNullable(person);
person1.filter(p -> p.getPersonName().startsWith("zhang"))
.ifPresent(p-> System.out.println(p.getPersonName()));
输出结果:
2.4.2 isPresent说明: 如果p的结果为true,则返回原本的optional,否则返回空的optional 。 p -> p.getPersonName() 为空的会报空指针
判断optional是否为空,如果空则返回false,否则返回true
2.5 数据转换 2.6 map如果optional不为空,则将optional中的对象 t 映射成另外一个对象 u,并将 u 存放到一个新的optional容器中。
Person person =new Person("zhangsan",
Arrays.asList(new Book("1"),
new Book("2"),
new Book("3")));
Optional> books = Optional.ofNullable(person)
.map(person1 -> person1.getBooks());
books.ifPresent(s->s.stream().forEach(t-> System.out.println(t.getBookName())));
输出结果:
总结说明: 以上例子是将对象映射成list对象重新封装进optional中,我们就可以对这个新的optional操作消费了
个人理解,在日常开发中对其使用最多就是处理对象的空指针情况。其他的使用较少



