Optional
Optional类型(P11)
Optional对象是一种包装器对象,要么包装了类型T的对象,要么没有包装任何对象。
Optional类型被当作一种更安全的方式,用来代替类型T的引用,这种引用要么引用某个对象,要么为null。但是,它只有在正确使用的情况下才会更安全。
如何使用Optional值(P11-12)
有效地使用Optional的关键是要使用这样的方法:它在值不存在的情况下会产生一个可代替物,而只在值存在的情况下才会使用这个值。
//没有任何匹配时,使用默认值""
String result = optionalString.orElse("");
//The wrapped string , or "" if none.
//调用代码来计算默认值
String result = optionalString.orElseGet(
() -> Local.getDefault().getDisplayName();
//The function is only called when needed
//没有值时抛出异常
String result = optionaleString.orElseThrow(IllegalStateException::new);
//Supply a method that yields an exception object
ifPresent方法会接受一个函数。如果该可选值存在,那么它会被传递给该函数。否则,不会发生任何事情。当调用ifPresent时,从该函数不会返回任何值。如果想要处理函数的结果,可以使用map。
optionalValue.ifPresent(result::add);
/*现在added具有三种值之一:
在optionalValue存在的情况下包装在Optional中的true或false
在optionalValue不存在的情况下的空的Optional
*/
Optional<Boolean> added = optionalValue.map(results::add);
java.util.Optional 8
T orElse(T other)
产生这个Optional的值,或者在该Optional为空时,产生other。
T orElseGet(Supplier<? extends T> other)
产生这个Optional的值,或者在该Optional为空时,产生调用other的结果。
T orElseThrow(Supplier<? extends x> exceptionSupplier)
产生这个Optional的值,或者在该Optional为空时,抛出调用exceptionSupplier的结果。
void ifPresent(Consumer<? super T> consumer)
如果该Optional不为空,那么就将它的值传递给consumer
\ Opional\ map(Function<? super T,? extends U> mapper)
产生将该Optional的值传递给mapper后的结果,只要这个Optional不为空且结果不为null,否则产生一个空Optional。
T get()
产生这个Optional的值,或者在该Optional为空时,抛出一个NoSuchElementException
boolean isPresent()
如果该Optional不为空,则返回true。
创建Optional值(P13-15)
java.util.Optional 8
static Optional of(T value)
static Optional ofNullable(T value)
产生一个具有给定值的Optional。如果value为null,那么第一个方法会抛出一个NullPointerException对象,第二个返方法会产生一个空Optional。
static Optional empty()
产生一个空Optional。
\ Optional\ flatMap(Function<? super T, Optional\> mapper)
产生将mapper应用于当前的Optional值所产生的结果,或者在当前Optional为空时,返回一个空Optional。
Last updated