Необязательные и картографические действия - PullRequest
0 голосов
/ 24 мая 2019

У меня есть следующий случай, который я, кажется, не понимаю, как я должен справиться с этим правильно.

Предположим, следующая доменная структура. У меня есть объект customer, в котором хранится список объектов контактов.

Теперь я хочу сделать следующее:

1) Попытка получить указанного клиента (необязательно).

2) Если он существует, используйте его для извлечения контактного объекта.

Мой код на данный момент выглядит так:

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

Обратите внимание, что объект customer был инициализирован как необязательный. Теперь мой вопрос следующий:

Я хотел бы избавиться от операторов 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);

1 Ответ

2 голосов
/ 24 мая 2019

Вы можете использовать Optional.filter() с Stream.anyMatch() и Optional.isPresent():

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