我再次遇到Stream API问题。我要实现的功能并不是最困难的事情,但是由于类型不兼容,并且在进行正确比较时,我遇到了过滤困难。目的是获取有关给定部分链接到的部门的信息。
department.getSectionId()
返回Long
,而Section::getId
是Integer
(我不能更改)
private List<DepartmentInfo> retrieveLinkedDepartments(final Collection<Section> sections) {
return this.departmentDao
.findAll()
.stream()
.filter(department -> department.getSectionId() != null)
.filter(department -> department.getSectionId().equals(sections.stream().map(Section::getId)))
.map(this.departmentInfoMapper::map)
.collect(Collectors.toList());
}
当然,主谓词的结果始终为false。我知道代码很糟糕,而且我没有正确定义条件,但希望您能理解。也许有可能以某种方式合并这些集合或以一种聪明的方式进行比较。
先谢谢您!
答案 0 :(得分:6)
到目前为止,您正在比较Long
和Steam<Integer>
,它们将始终返回false。
您可以稍微翻转一下逻辑,然后使用mapToLong
将int转换为Long
:
private List<DepartmentInfo> retrieveLinkedDepartments(final Collection<Section> sections) {
return this.departmentDao
.findAll()
.stream()
.filter(department -> department.getSectionId() != null)
.filter(department -> sections.stream()
.mapToLong(Section::getId)
.anyMatch(department.getSectionId()::equals))
.map(this.departmentInfoMapper::map)
.collect(Collectors.toList());
}
这会将Section::getId
转换为Stream<Long>
,然后对Stream
进行过滤以查看department.getSectionId
中的任何一个是否等于ID。
答案 1 :(得分:4)
您可能正在寻找类似的东西:
private List<DepartmentInfo> retrieveLinkedDepartments(final Collection<Section> sections) {
Set<Long> sectionIds = sections.stream()
.map(Section::getId)
.map(Long::valueOf)
.collect(Collectors.toSet()); // collect all the possible sectionIds
return this.departmentDao
.findAll()
.stream()
.filter(department -> department.getSectionId() != null)'
// validate if the sectionIds include this department's section id or not
.filter(department -> sectionIds.contains(department.getSectionId()))
.map(this.departmentInfoMapper::map)
.collect(Collectors.toList());
}
场外主谓的结果始终为假
那是因为您一直在比较使用Long
生成的department.getSectionId()
和使用Stream<Integer>
生成的sections.stream().map(Section::getId)
,这两种类型的比较总是不相等的,因此结果false
。
编辑 :正如Holger在评论中指出的,Set
的编写代码可以改进为:
Set<Long> sectionIds = sections.stream()
.mapToLong(Section::getId)
.boxed()
.collect(Collectors.toSet());
答案 2 :(得分:2)
在这一行department.getSectionId().equals(sections.stream().map(Section::getId)
中,您将Long
与Stream<Integer>
进行比较,该结果将始终为false。
相反,将Section
id映射到Set<Long>
,然后在contains
操作中使用filter
:
Set<Long> ids = sections.stream() // Stream<Section>
.map(Section::getId) //Stream<Integer>
.filter(Objects::nonNull) // remove potential null elements
.map(Integer::longValue) // Stream<Long>
.collect(Collectors.toSet()); //Set<Long>
return this.departmentDao
.findAll()
.stream()
.filter(department -> department.getSectionId() != null)
.filter(department -> ids.contains(department.getSectionId()))
.map(this.departmentInfoMapper::map)
.collect(Collectors.toList());