繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM