在日常开发中,为了对参数进行校验以及其它操作我们会对其进行繁冗的遍历、过滤来避免空指针异常(NullPointException)。这样往往会增加代码开发量以及对简洁度的影响,所以推荐使用Java8中的Optional类来避免这种情况的发生。下面是Optional类中的常用方法,可以根据实际情况进行实际运用:
Of-创建
//创建一个String类型的optional对象
//注意:of()不支持接受null,否则出现No Such Value错误
Optional<String> name = Optional.of("Sanaulla");
ofNullable-创建
//和Of()的区别就是可以支持接受null
Optional<Object> empty = Optional.ofNullable(null);
empty-创建
//创建一个空的optional
Optional<String> empty = Optional.empty();
isPresent-判断
Optional<String> name = Optional.of("test");
//对optional对象进行值判断,如果值存在则输出值
if (name.isPresent()) {
//注意:若值为空,则抛出异常,因为使用的是of()
System.out.println(name.get());//输出test
}
ifPresent-判断
Optional<String> optional = Optional.ofNullable("abc");
//ifPresent支持使用lambda表达式作为参数。
optional.ifPresent(o -> {
//值修改
o = o + "S";
log.debug(o);//日志输出”abcS“
});
log.debug(optional.get());//日志输出”abc“
//注意:上下两个日志值打印不一致问题
orElse 和 OrElseGet-判断
Optional optionalA = Optional.ofNullable("test");
Optional optionalB = Optional.ofNullable(null);
//对于orElse(T other),当optional不为空返回原始值,反之返回other,如下:
optionalA.orElse("abc");//返回”test“
optionalB.orElse("abc");//返回”abc“
//对于OrElseGet(),和OrElse()的区别就是能够接受lambda表达式生成默认值。
System.out.println(optionalA.orElseGet(() -> "ABC"));//返回”test“
System.out.println(optionalB.orElseGet(() -> "ABC"));//返回”ABC“
map-值操作
Optional<String> optionalA = Optional.of("test");
//通过lambda表达式进行值变化
Optional<String> optionalB = optionalA.map(value -> value.toUpperCase());
System.out.println(upperName.orElse("No value found"));//"TEST"
flatMap-值操作
//和map()的区别在于返回参数必须是Optional对象
Optional<String> optionalB = optionalA.flatMap(
value -> Optional.of(value.toUpperCase())
);
filter-值操作
//可以类比lambda表达式中的filte理解
Optional<String> optionalA = Optional.of("0123");
//如果不满足条件则返回一个空的optional对象反之返回原始值
Optional<String> optionalB = optionalA.filter((value) -> value.length() > 5);
System.out.println(longName.orElse("The length of optionalB is shortter than optionalA"));
//输出The length of optionalB is shortter than optionalA