java - 有没有一种优雅的方法来打开包裹在 2 个嵌套的 Optionals 中的对象?

标签 java java-8 option-type

考虑这两个类

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/

相关文章:

Java - 如何对通用 ArrayList 进行子类化,以便 MyArrayList<foo> 的实例成为 ArrayList<foo> 的子类?

java - Eclipse 调试器指向源代码中的错误行

java - 如何短路 Stream 上的 reduce() 操作?

Java mockito 服务测试参数取反

Java Util 可选代码到 Guava 可选映射和过滤器

swift - 为什么我不能将隐式解包的可选项作为 UnsafeMutablePointer 传递?

java - 如何使用索引调试每个循环?

java - 基于java中的动态串行有序输入流对数据进行排序和分区

ios - swift if-let 不会打开可选的 NSDictionary

java - 根据 Controller 返回值调用javascript方法