代码之家  ›  专栏  ›  技术社区  ›  Chris Garsonn

在Java中,如何根据多个参数过滤列表上的数据?

  •  1
  • Chris Garsonn  · 技术社区  · 6 年前

    List<GroupOffice> officesOfTheGroup;
    

    我想搜索id是否不等于 (长值)但标签是

     public GroupOfficeDto saveGroupOffice(GroupOfficeDto groupOfficeDto) {     
                List<GroupOffice> officesOfTheGroup = //some list from db..
                for (GroupOffice go : officesOfTheGroup) {
                    if ((!go.getId().equals(groupOfficeDto.getId())) && go.getLabel().equals(groupOfficeDto.getLabel())) {
                        return groupOfficeDto;
                    }
            return null:
    }
    

    或者我如何使用流?如果是这样,使用流是更好的方法吗?

    注:

    3 回复  |  直到 6 年前
        1
  •  5
  •   Ruslan    6 年前

    如果需要布尔值,可以执行以下操作:

    boolean b = officesOfTheGroup.stream()
        .anyMatch(office -> !office.getId().equals(5) && office.getLabel().equals("London"))
    
        2
  •  2
  •   John Bollinger    6 年前

    有没有更好的方法,而不是用 for

    值得注意的是,您的代码 在到达列表末尾之前,如果找到一个可接受的项目,则检查所有项目。但是,如果您只需要处理列表,那么除了准备检查每个列表元素之外,别无选择。至于是否使用 对于 loop,我想那很好。

    或者我如何使用流?如果是这样,使用流是更好的方法吗?

    现在使用流确实非常流行,尽管它们的使用似乎比我认为的要多,但您的用例并不是不合理的。你可以这样写:

    public GroupOfficeDto saveGroupOffice(GroupOfficeDto groupOfficeDto) {     
        List<GroupOffice> officesOfTheGroup = //some list from db..
        Integer officeId = groupOfficeDto.getId();
        String officeLabel = groupOfficeDto.getLabel();
    
        return officesOfTheGroup.stream()
                .filter(o -> !o.getId().equals(officeId))
                .anyMatch(o -> o.getLabel().equals(officeLabel))
            ? groupOfficeDto : null;
    }
    

    这里特别相关的是 .anyMatch() 循环,而不是处理整个流。还请注意,用于比较办公室的ID和标签被提取并存储在流表达式之前的变量中。这允许它们成为“有效的最终”,这对于它们出现在流中的lambda中是必要的。这样做也稍微更有效,而不是一次又一次地从DTO检索相同的对象——对于

        3
  •  1
  •   Max Farsikov    6 年前

    试试这个:

    public GroupOfficeDto saveGroupOffice(GroupOfficeDto groupOfficeDto) {
        ...     
        List<GroupOffice> result = officesOfTheGroup.stream()
            .filter(it -> it.getLabel().equals(groupOfficeDto.getLabel()))
            .filter(it -> !it.getId().equals(groupOfficeDto.getId()))
            .collect(Collectors.toList())
        ...
    }