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我喜欢这个主意。我们需要的就是有意义的代码。我更新了:)哦,哇,简单是天才!谢谢。我不知道为什么我把它弄得这么复杂。谢谢你们的重构技巧,伙计们!