Java核心技术:Java SE 8的流库——Optional类型

如何使用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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值