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

Gei*_*eir 8 java optional java-8

考虑这两个类

class EmailService {
    public Optional<String> getEmailAlias(String email);
}

enum Queue {
    public static Optional<Queue> fromEmailAlias(String alias);
}
Run Code Online (Sandbox Code Playgroud)

上述方法的实现对于这个问题并不重要,所以为了简单起见,我把它留了下来.

我想做这个:

emailService.getEmailAlias("john@done")
    .map(Queue::fromEmailAlias)
    .ifPresent(queue -> { 
        // do something with the queue instance, oh wait it's an Optional<Queue> :(
    });
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,因为queue是类型Optional<queue>(与返回的类型相同Queue::fromEmailAlias),所以我改为:

emailService.getEmailAlias("john@done")
    .map(Queue::fromEmailAlias)
    .ifPresent(q-> { 
            q.ifPresent(queue -> {
                // do something with the queue instance
            }
    });
Run Code Online (Sandbox Code Playgroud)

一种丑陋的imho.

改变签名

public static Optional<Queue> fromEmailAlias(String alias);
Run Code Online (Sandbox Code Playgroud)

public static Queue fromEmailAlias(String alias);
Run Code Online (Sandbox Code Playgroud)

是一个快速修复,但这也会影响我需要的其他地方的代码Optional<Queue>.

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

Mar*_*nik 13

你需要申请flatMap:

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

             });
Run Code Online (Sandbox Code Playgroud)