Optional类
出现目的:不用显示检测,直接应对空指针异常
测试用类
@Data
public class Boy {
private String name;
private Girl girl;
}
@Data
public class Girl {
private String name;
}
空指针异常
获取boy对象中girl对象的name属性
@Test
public void test1(){
Boy boy = new Boy();
String girlName = getGirlName(boy);
System.out.println(girlName);
}
public String getGirlName(Boy boy){
String girlName = boy.getGirl().getName();
return girlName;
}
测试结果
java.lang.NullPointerException
at com.wdlm.optional.test.OptionalTest.getGirlName(OptionalTest.java:20)
at com.wdlm.optional.test.OptionalTest.test1(OptionalTest.java:10)
显式判断空指针
@Test
public void test2(){
Boy boy = new Boy();
String girlName = getGirlName(boy);
System.out.println(girlName);
}
public String getGirlName(Boy boy){
if (boy == null){
return null;
}
Girl girl = boy.getGirl();
if (girl == null){
return null;
}
return girl.getName();
}
测试结果
null
Optional类api简介
1.创建Optional对象:
Optional.empty(): 创建一个空的Optional对象。
Optional.of(value): 创建一个包含特定非空值的Optional对象,如果value为空,则抛出NullPointerException异常。
Optional.ofNullable(value): 创建一个包含特定值的Optional对象,如果value为空,则返回一个空的Optional对象。
示例代码
Optional<Object> empty = Optional.empty();
System.out.println(empty);
Girl girl = new Girl();
Optional<Girl> girl1 = Optional.of(girl);
System.out.println(girl1);
girl = null;
Optional<Girl> girl2 = Optional.ofNullable(girl);
System.out.println(girl2);
运行结果
Optional.empty
Optional[Girl(name=null)]
Optional.empty
2.判断Optional对象是否包含值:
isPresent(): 判断Optional对象是否包含非空值,返回boolean类型。
示例代码
Girl girl = null;
Optional<Girl> girl1 = Optional.ofNullable(girl);
if(girl1.isPresent()){
System.out.println("Optional<Girl>中存在值");
}else {
System.out.println("Optional<Girl>中值为空");
}
3.获取Optional对象的值:
get(): 获取Optional对象中的值,如果Optional为空,则抛出NoSuchElementException异常(使用前最好先使用isPresent()进行判断)。
orElse(defaultValue): 获取Optional对象中的值,如果Optional为空,则返回默认值defaultValue。
orElseGet(supplier): 获取Optional对象中的值,如果Optional为空,则通过提供的Supplier函数式接口生成一个默认值并返回。
orElseThrow(exceptionSupplier): 获取Optional对象中的值,如果Optional为空,则抛出由提供的异常Supplier函数式接口生成的异常。
示例代码
Girl girl = new Girl();
girl.setName("杨幂");
Optional<Girl> girl1 = Optional.ofNullable(girl);
Girl girl2 = girl1.get();
String name = girl2.getName();
System.out.println(name);
girl = null;
Optional<Girl> girl3 = Optional.ofNullable(girl);
Girl girl4 = new Girl();
girl4.setName("赵丽颖");
Girl girl5 = girl3.orElse(girl4);
String name1 = girl5.getName();
System.out.println(name1);
Girl girl6 = girl3.orElseGet(Girl::new);
System.out.println(girl6);
运行结果
杨幂
赵丽颖
Girl(name=null)
4.对Optional对象进行操作:
ifPresent(consumer): 如果Optional对象中存在值,则对该值执行特定操作,接受一个Consumer函数式接口。
map(mapper): 对Optional对象中的值进行映射处理,返回一个新的Optional对象。
flatMap(mapper): 对Optional对象中的值进行映射处理,并将结果包装在一个Optional对象中,返回一个新的Optional对象。
filter(predicate): 对Optional对象中的值进行过滤,如果满足条件则返回原Optional对象,否则返回一个空的Optional对象。
示例代码
Girl girl = new Girl();
girl.setName("杨幂");
Optional<Girl> girl1 = Optional.ofNullable(girl);
girl1.ifPresent(g -> System.out.println(g.getName()));
Optional<String> s = girl1.map(g -> g.getName());
System.out.println(s);
Optional<Girl> girl2 = girl1.filter(g -> g.getName() == "xxx");
System.out.println(girl2);
运行结果
杨幂
Optional[杨幂]
Optional.empty
使用Optional类解决一开始的空指针问题
Optional<Boy> boyOptional = Optional.ofNullable(boy);
Boy boy1 = new Boy();
Girl girl = new Girl();
girl.setName("杨幂");
boy1.setGirl(girl);
Boy boy2 = boyOptional.orElse(boy1);
Girl girl1 = boy2.getGirl();
Optional<Girl> girl2 = Optional.ofNullable(girl1);
Girl girl3 = girl2.orElse(girl);
return girl3.getName();
运行结果
杨幂