Java 8引入Optional类来防止空指针异常,Optional类最先是由Google的Guava项目引入的。Optional类实际上是个容器:它可以保存类型T的值,或者保存null。使用Optional类我们就不用显式进行空指针检查了。
empty方法通过工厂创建一个空的Optional.
示例:
Optional empty = Optional.empty();
of方法通过工厂方法创建Optional类。
注:创建对象时传入的参数不能为null。如果传入参数为null,则抛出NullPointerException。
示例:
//调用工厂方法创建Optional实例
Optional name = Optional.of("Sanaulla");
//传入参数为null,抛出NullPointerException.
Optional someNull = Optional.of(null);
ofNullable与of方法相似,唯一的区别是可以接受参数为null的情况
示例:
//下面创建了一个不包含任何值的Optional实例
//例如,值为'null'
Optional empty = Optional.ofNullable(null)
isPresent用来判断Optinal是否有值。如果值存在返回true,否则返回false。
示例:
Optional emptyOptional = Optional.empty();
// emptyOptional为空,打印结果为true
System.out.println(emptyOptional.isPresent());
Optional ofOptional = Optional.of("wang");
// ofOptional有值,打印结果为true
System.out.println(ofOptional.isPresent());
filter方法接受一个条件函数,对Optional进行过滤。如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional。
示例:
//filter方法检查给定的Option值是否满足某些条件。
//如果满足则返回同一个Option实例,否则返回空Optional。
Optional age = Optional.of(20);
Optional oldAge = age.filter(a -> a > 18);
Optional lessAge = age.filter(a -> a < 18);
// 打印结果:Optional[20]
System.out.println(oldAge);
// 打印结果:Optional.empty
System.out.println(lessAge);
map方法用来对Optional实例的值执行一系列操作。通过一组实现了Function接口的lambda表达式传入操作。如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。
示例:
Optional emptyOptional = Optional.empty();
Optional ageMap = Optional.of(20);
Optional ageMap_ = ageMap.map(a -> "ageMap:" + a);
Optional emptyMap = emptyOptional.map(a -> "ageMap:" + age);
Optional nullMap = ageMap.map(a -> null);
// 打印结果:Optional[ageMap:20]
System.out.println(ageMap_);
// 打印结果:Optional.empty
System.out.println(emptyMap);
// 打印结果:Optional.empty
System.out.println(nullMap);
如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装。
示例:
Optional flat = Optional.of("hello flatMap");
Optional flatMap = flat.flatMap(it -> Optional.of(it.toUpperCase()));
// 打印结果:Optional[HELLO FLATMAP]
System.out.println(flatMap);
get方法将获取Optional中value的值,如果存在值,则返回该值,否则抛出NoSuchElementException。
示例:
Optional getOptional = Optional.of("This is a Optional");
String valueOptional = getOptional.get();
// 打印结果:This is a Optional
System.out.println(valueOptional);
如果Optional实例有值则将其返回,否则返回orElse方法传入的参数。
示例:
//如果值不为null,orElse方法返回Optional实例的值。
//如果为null,返回传入的消息。
//输出:There is no value present!
System.out.println(empty.orElse("There is no value present!"));
//输出:Sanaulla
System.out.println(name.orElse("There is some value!"));
rElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值。
示例:
//orElseGet与orElse方法类似,区别在于orElse传入的是默认值,
//orElseGet可以接受一个lambda表达式生成默认值。
//输出:Default Value
System.out.println(empty.orElseGet(() -> "Default Value"));
//输出:Sanaulla
System.out.println(name.orElseGet(() -> "Default Value"));
orElseThrow
在orElseGet方法中,我们传入一个Supplier接口。然而,在orElseThrow中我们可以传入一个lambda表达式或方法,如果值不存在来抛出异常。
示例:
try {
//orElseThrow与orElse方法类似。与返回默认值不同,
//orElseThrow会抛出lambda表达式或方法生成的异常
empty.orElseThrow(ValueAbsentException::new);
} catch (Throwable ex) {
//输出: No value present in the Optional instance
System.out.println(ex.getMessage());
}