1. 概述
- Optional< T >类是要给容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null, 表示这个值不存在。原来用null表示一个值不存在,现在Optional可以更好的表达这个概念。并且可以避免空指针异常。
- Optional类的Javadoc描述如下:这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象
2. 常用方法
-
Optional类提供了很多有用的方法,这样我们就不用显式进行空值检测
-
创建Optional类对象的方法
- Optional.of(T t):创建一个Optional实例,t必须非空
- Optional.empty():创建一个空的Optional实例
- Optional.ofNullable(T t):t可以为null
-
判断Optional容器中是否包含对象
- boolean isPresent():判断是否包含对象
- void ifPresent(Consumer<? super T> consumer):如果有值,就执行Consumer接口的实现代码,并且该值会作为参数传给它
-
获取Optional容器的对象
- T get():如果调用对象包含值,返回该值,否则抛出异常
- T orElse(T other):如果有值则将其返回,否则返回指定的other对象
- T orElseGet(Supplier<? extends other>):如果有值则将其返回,否则返回由Supplier接口实现提供的对象
- T orElseThrow(Supplier<? extends X> exceptionSupplier):如果有值则将其返回,否则抛出由Supplier接口实现提供的异常
-
代码示例
package Java8;
import org.junit.Test;
import java.util.Optional;
public class OptionalTest {
@Test
public void test1() {
Girl girl = new Girl();
Optional<Girl> optionalGirl = Optional.of(girl);
}
@Test
public void test2() {
Girl girl1 = new Girl();
Girl girl2 = new Girl();
girl2 = null;
Optional<Girl> optionalGirl1 = Optional.ofNullable(girl1);
Optional<Girl> optionalGirl2 = Optional.ofNullable(girl2);
System.out.println(optionalGirl1);
System.out.println(optionalGirl2);
}
// 未进行非空判断,极有可能空指针异常
public String getGirlName(Boy boy) {
return boy.getGirl().getName();
}
// 未使用Optional的getGirlName
public String getGirlName1(Boy boy) {
if (boy != null) {
Girl girl = boy.getGirl();
if (girl != null) {
return girl.getName();
}
}
return null;
}
// 使用Optional类
public String getGirlName2(Boy boy) {
Optional<Boy> boyOptional = Optional.ofNullable(boy);
Boy boy1 = boyOptional.orElse(new Boy(new Girl("关悦")));
Girl girl = boy1.getGirl();
Optional<Girl> girlOptional = Optional.ofNullable(girl);
Girl girl1 = girlOptional.orElse(new Girl("杨雨潼"));
return girl1.getName();
}
@Test
public void test3() {
Girl girl = new Girl();
girl = null;
Optional<Girl> optionalGirl = Optional.ofNullable(girl);
// orElse(T t): 如果当前的Optional内部封装的t是非空的,则返回内部的t, 如果内部t为空,则返回orElse()里的参数t1
Girl girl1 = optionalGirl.orElse(new Girl("欧阳娜娜"));
System.out.println(girl1);
}
@Test
public void test4() {
Boy boy = new Boy();
boy = null;
String girlName = getGirlName1(boy);
System.out.println(girlName);
}
@Test
public void test5() {
Boy boy = null;
boy = new Boy();
String girlName = getGirlName2(boy);
System.out.println(girlName);
}
}
运行结果