我正在尝试构建一个不是很简单的流管道,这使我感到困惑。
这个想法是我有一个包含要遍历的实体集的类。 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做到这一点的方法?
答案 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))