考虑这两个类
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
}
});
有点丑陋恕我直言。
更改签名
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 -> {
});
关于java - 有没有一种优雅的方法来打开包裹在 2 个嵌套的 Optionals 中的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32007872/