[英]Is there an elegant way to unwrap an object wrapped in 2 nested Optionals?
考虑这两个类
class EmailService {
public Optional<String> getEmailAlias(String email);
}
enum Queue {
public static Optional<Queue> fromEmailAlias(String alias);
}
上述方法的实现对于这个问题并不重要,所以为了简单起见,我把它留了下来。
我想做这个:
emailService.getEmailAlias("john@done")
.map(Queue::fromEmailAlias)
.ifPresent(queue -> {
// do something with the queue instance, oh wait it's an Optional<Queue> :(
});
但是,这不起作用,因为queue
的类型为Optional<queue>
(与Queue::fromEmailAlias
返回的类型相同),所以我改为:
emailService.getEmailAlias("john@done")
.map(Queue::fromEmailAlias)
.ifPresent(q-> {
q.ifPresent(queue -> {
// do something with the queue instance
}
});
一种丑陋的imho。
改变签名
public static Optional<Queue> fromEmailAlias(String alias);
至
public static Queue fromEmailAlias(String alias);
是一个快速修复,但这也会影响我需要Optional<Queue>
其他地方的代码。
有没有一种很好的方法来解开这个嵌套的Optional?
您需要应用flatMap
:
emailService.getEmailAlias("john@done")
.flatMap(Queue::fromEmailAlias)
.ifPresent(queue -> {
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.