考虑这两个类
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>
的其他地方的代码。
有没有一种很好的方法来解开这个嵌套的可选项?
答案 0 :(得分:13)
您需要申请flatMap
:
emailService.getEmailAlias("john@done")
.flatMap(Queue::fromEmailAlias)
.ifPresent(queue -> {
});