Prakash
Prakash

Reputation: 273

java 8 streams filter by list over list

I need to filter condition by firstname and lastname in the List of names present in either official or unOfficial names List and return List of EmployeeDetails. Below are the pojo classes

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;
    }
}

I tried for filtering with list of officialNames and it is working fine,but I also want to filter names present in unOfficial Names also.(OR Condition)

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

Help me to solve the issue.Thanks

Upvotes: 2

Views: 763

Answers (2)

Eugene
Eugene

Reputation: 120858

If you can't override equals/hashCode (if you could there would be a faster way), then:

  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());

Upvotes: 2

joker
joker

Reputation: 3752

Just add the OR condition:

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());

Upvotes: 0

Related Questions