Java 8 检索映射流所基于的实体的id

Java 8 检索映射流所基于的实体的id,java-8,java-stream,Java 8,Java Stream,我正在尝试构建一个流管道,这并不是很简单,它让我感到困惑 其思想是,我有一个类,其中包含一组我想要遍历的实体应用程序类定义一个字段设置文档。在这些文档中,我有一个字段DocumentFile。我根据这个文档文件的名称过滤流,但是我需要的结果是文档的id实体 所以方法是这样的: private long retrieveSmth(String docName, long applicationId) { final Application application = this.applic

我正在尝试构建一个流管道,这并不是很简单,它让我感到困惑

其思想是,我有一个类,其中包含一组我想要遍历的实体<代码>应用程序类定义一个字段
设置文档
。在这些文档中,我有一个字段
DocumentFile
。我根据这个文档文件的名称过滤流,但是我需要的结果是
文档的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。使用流API有办法做到这一点吗?

如果将
map()
映射到
DocumentFile
,则无法“返回”到
DocumentFile
的所有者对象:
已转换为

因此,您不应该从
Stream.filter()映射并指定要测试的对象:

final long docId = application.getDocuments()
                              .stream()
                              .filter(doc -> doc.getDocumentFile().getDocumentFileName().equals(docName))
                              .map(Document::getId); // now it is possible
请注意,您应避免与陌生人交谈,这会产生异味:

doc.getDocumentFile().getDocumentFileName()
因此,在
Document
中引入一种方法
matchesName()
,进行委托和平等性测试是很有意思的:

public boolean matchesName(String name){
      return name.equals(getDocumentFile().getDocumentFileName());
}
这样听起来更好:

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

或者更好的是,一种检查给定名称是否匹配的方法,即
公共布尔匹配名称(字符串名称){return name.equals(getDocumentFile().getDocumentFileName();}
,然后在lambda表达式中使用它:
.filter(doc->doc.matchesName(docName))
@Federico Peralta Schaffner我喜欢这个主意。我们需要的就是有意义的代码。我更新了:)哦,哇,简单是天才!谢谢。我不知道为什么我把它弄得这么复杂。谢谢你们的重构技巧,伙计们!