首页 > 解决方案 > 选项和映射操作

问题描述

我有以下情况,我似乎不明白我应该如何正确处理它。

假设以下域结构。我有一个存储联系人对象列表的客户对象。

现在我想做以下事情:

1) 尝试找回所述客户(可选)。

2)如果存在,则使用它来检索联系人对象。

我当时的代码如下所示:

Contact contact = customer.map(cust -> getContacts().stream()
                                                    .findFirst()
                                                    .orElse(null))
                          .orElse(null);

请注意,客户对象已被初始化为 Optional。现在我的问题如下:

我想摆脱这些orElse语句以简化代码,并根据所讨论的对象是否等于另一个对象来简单地返回 true 或 false。到目前为止,我已经尝试过了,我认为它可以完成这项工作。

return customer.map(cust -> getContacts()
                            .stream()
                            .findFirst()
                            .map(custContact -> custContact.map(contact::equals).orElse(false))
                            .orElse(false);

我的主要问题是,这可以进一步简化吗?我想我在这些映射操作中遗漏了一些东西,但我不太确定。

我的另一个解决方案是这个:

return customer.map(cust -> getContacts()
                           .stream()
                           .findFirst()
                           .map(contact::equals).orElse(false))
                           .orElse(false);

标签: javalambdaoptional

解决方案


您可以Optional.filter()使用Stream.anyMatch()Optional.isPresent()

customer.filter(cust -> getContacts().stream().anyMatch(contact::equals)).isPresent();

推荐阅读