Получить идентификатор объекта, на основе которого отображается поток - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь построить потоковый конвейер, который не очень прост, и это меня озадачивает.

Идея в том, что у меня есть класс, содержащий набор сущностей, которые я хочу пройти. Application класс определяет поле Set<Document> documents. Внутри этих документов у меня есть поле DocumentFile documentFile. Я фильтрую поток по имени этого файла документа, но в результате мне нужен идентификатор Document сущности.

Итак, метод выглядит так:

private long retrieveSmth(String docName, long applicationId) {
    final Application application = this.applicationDao.get(applicationId);
    final long docId = application.getDocuments()
                                  .stream()
                                  .map(Document::getDocumentFile)
                                  .filter(doc -> doc.getDocumentFileName().equals(docName))
                                  ...
}

В этот момент я зацикливаюсь на вопросе, как вернуть элемент управления на уровень Document и получить идентификатор документа, файл документа которого удовлетворяет условию. Есть ли способ сделать это с помощью Stream API?

1 Ответ

0 голосов
/ 11 сентября 2018

Если вы map() до DocumentFile, вы не можете «вернуться» к объекту-владельцу DocumentFile: Stream<Document> был преобразован в Stream<DocumentFile>.
Вы не должны отображать и указыватьобъект для проверки с Stream<Document>.filter():

final long docId = application.getDocuments()
                              .stream()
                              .filter(doc -> doc.getDocumentFile().getDocumentFileName().equals(docName))
                              .map(Document::getId); // now it is possible

Обратите внимание, что вам следует избегать разговоров с незнакомцами, и это создает неприятный запах:

doc.getDocumentFile().getDocumentFileName()

Так что было бы интересно ввести методmatchesName() в Document, который выполняет делегирование и тест на равенство:

public boolean matchesName(String name){
      return name.equals(getDocumentFile().getDocumentFileName());
}

Так звучит лучше:

.filter(doc -> doc.matchesName(docName))
...