是否有一种优雅的方式来展开包装在2个嵌套的Optionals中的对象?

时间:2015-08-14 10:26:10

标签: java java-8 optional

考虑这两个类

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>的其他地方的代码。

有没有一种很好的方法来解开这个嵌套的可选项?

1 个答案:

答案 0 :(得分:13)

您需要申请flatMap

emailService.getEmailAlias("john@done")
            .flatMap(Queue::fromEmailAlias)
            .ifPresent(queue -> { 

             });