Java核心技术:Java SE 8的流库——收集结果
如何使用Optional值
有效使用Optional的关键是要使用这样的方法:它在值不存在的情况下会产生一个可替代物,而只有在值存在的情况下才会使用这个值。
第一条策略:在没有任何匹配时,产生相应的替代物。
// 使用默认值
String result = optionalString.orElse("");
// 计算默认值
String result = optionalString.orElseGet(() -> Locale.getDefault().getDisplayName());
// 抛出异常
String result = optionalString.orElseThrow(IllegalStateException::new);
另一条策略:只有在其存在的情况下才消费该值。
ifPresent方法接收一个函数。如果可选值存在,才会传递给该函数。否则,不会发生任何事情。
optionalValue.ifPresent(v -> Process v);
// 在该值存在时将其添加到某个集合
optionalValue.ifPresesnt(v -> results.add(v));
不适合使用Optional值的方式
get方法会在Optional值存在情况下获得其中包装的元素,或不存在的情况下抛出一个NoSuchElementException对象。因此,optionalValue.get().someMethod();
并不比value.someMethod();
更安全。
isPresent方法会报告某个Optional对象是否具有一个值。但if(optionalValue.isPresent()) optionalValue.get().someMethod();
并不比if(value != null) value.someMethod();
更容易处理。
创建Optional值
Optional.of(result)
用来创建一个包含可选值的Optional对象,Optional.empty()
用来创建一个不包含可选值的Optional对象。
public static Optional<Double> inverse(Double x) {
return x == 0 ? Optional.empty() : Option.of(1 / x);
}
ofNullable方法用来作为可能出现null值和可选值之间的桥梁。Optional.ofNullable(obj)
会在obj不为null的情况下返回Optional.of(obj)
,否则返回Optional.empty()
。
使用flatMap来构建Optional值的函数
假设有一个产生Optional对象的方法f,并且目标类型T具有一个可以产生Optional对象的方法g。不能通过调用s.f().g()来将它们组合起来。因为s.f()的类型为Optional,而不是T。因此,需要调用:
Optional<U> result = s.f().flatMap(T::g);