流中不同数字类型的转换/比较

时间:2019-01-09 14:23:47

标签: java collections java-stream

我再次遇到Stream API问题。我要实现的功能并不是最困难的事情,但是由于类型不兼容,并且在进行正确比较时,我遇到了过滤困难。目的是获取有关给定部分链接到的部门的信息。

department.getSectionId()返回Long,而Section::getIdInteger(我不能更改)

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。我知道代码很糟糕,而且我没有正确定义条件,但希望您能理解。也许有可能以某种方式合并这些集合或以一种聪明的方式进行比较。

先谢谢您!

3 个答案:

答案 0 :(得分:6)

到目前为止,您正在比较LongSteam<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)中,您将LongStream<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());