检索要基于其映射流的实体的ID

时间:2018-09-11 19:31:47

标签: java-8 java-stream

我正在尝试构建一个不是很简单的流管道,这使我感到困惑。

这个想法是我有一个包含要遍历的实体集的类。 Application类定义字段Set<Document> documents。在这些文档中,我有一个字段DocumentFile documentFile。我根据此文档文件的名称过滤流,但是我需要的结果是Document实体的ID。

因此方法如下:

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级别并检索其文档文件满足条件的文档的ID。有没有使用Stream API做到这一点的方法?

1 个答案:

答案 0 :(得分:3)

如果您从map()DocumentFile,则无法“返回”到DocumentFile的所有者对象:Stream<Document>已转换为Stream<DocumentFile>。 br /> 您不应该这样映射和指定要从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))