Java 8流按列表过​​滤列表

时间:2018-08-18 11:12:01

标签: java-8

我需要在正式或非正式名称列表中存在的名称列表中按名字和姓氏过滤条件,并返回EmployeeDetails列表。 下面是pojo课

public class EmployeeDetails {
    private NameDetails nameDetails;

    public NameDetails getNameDetails() {
        return nameDetails;
    }
    public void setNameDetails(NameDetails nameDetails) {
        this.nameDetails = nameDetails;
    }
}

public class NameDetails {
    private List<Name> officalName;
    private List<Name> unOfficialName;
    public List<Name> getOfficalName() {
        return officalName;
    }
    public void setOfficalName(List<Name> offiicalName) {
        this.officalName = offiicalName;
    }
    public List<Name> getUnOfficialName() {
        return unOfficialName;
    }
    public void setUnOfficialName(List<Name> unOfficialName) {
        this.unOfficialName = unOfficialName;
    }
}

public class Name {
    private String firstName;
    private String lastName;
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

我尝试使用OfficialNames列表进行过滤,但工作正常,但我也想过滤非官方名称中存在的名称。(或条件)

return employeeDetailList.stream().filter(employeeDetails->(employeeDetails.getNameDetails().getOffiicalName()).stream()
            .anyMatch(name-> (null!=name) && (firstName).equals(name.getFirstName()) && (lastName).equals(name.getLastName())))
            .collect(Collectors.toList());

帮我解决问题。谢谢

2 个答案:

答案 0 :(得分:2)

如果您无法覆盖equals/hashCode(如果可以,则可以采用更快的方法),

  employeeDetailList             
         .stream()
         .filter(x -> Stream.concat(
                          x.getNameDetails().getOfficalName().stream(),
                          x.getNameDetails().getUnOfficialName().stream()
                      )
                     .anyMatch(y -> Objects.equals(y.getFirstName(), firstName) &&
                                    Objects.equals(y.getLastName(), lastName)))
         .collect(Collectors.toList());

答案 1 :(得分:0)

只需添加OR条件:

return employeeDetailList.stream().filter(employeeDetails->
            ((employeeDetails.getNameDetails().getOffiicalName()).stream().anyMatch(name-> (null!=name) && (firstName).equals(name.getFirstName()) && (lastName).equals(name.getLastName()))))
            || ((employeeDetails.getNameDetails().getUnOfficialName()).stream().anyMatch(name-> (null!=name) && (firstName).equals(name.getFirstName()) && (lastName).equals(name.getLastName()))))
            .collect(Collectors.toList());