I have the following class Person -
Person.java -
public class Person {
    private int id;
    private String department;
    private double salary;
    public Person(int id, String department, double salary) {
        this.id = id;
        this.department = department;
        this.salary = salary;
    }
    public String getDepartment() {
        return department;
    }
    public double getSalary() {
        return salary;
    }
    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", department='" + department + '\'' +
                ", salary=" + salary +
                '}';
    }
}
It has the fields -
id, department, salary
Now I have first predicate -
Predicate<List<Person>> hasSalaryOf40k = list -> {
            boolean myReturn = false;
            Iterator<Person> iterator = list.iterator();
            while (iterator.hasNext()) {
                Person person = iterator.next();
                double salary = person.getSalary();
                if (salary == 40000) {
                    myReturn = true;
                    break;
                }
            }
            return myReturn;
        };
Here, I want to filter out those lists having persons with salary as 40K.
Second predicate -
Predicate<List<Person>> isDeveloper = list -> {
            boolean myReturn = false;
            Iterator<Person> iterator = list.iterator();
            while (iterator.hasNext()) {
                Person person = iterator.next();
                String department = person.getDepartment();
                if (department.equals("Developer")) {
                    myReturn = true;
                    break;
                }
            }
            return myReturn;
        };
Here, I want to filter out those lists having persons with department as 'developer'
Third predicate -
Predicate<List<Person>> hasSalaryOf40kAndIsDeveloper = list ->
                hasSalaryOf40k.and(isDeveloper).test(list);
Here, I want to filter out those lists having persons with both salary as 40K and department as "developer"
Now I have the following two lists -
List<Person> list1 = new ArrayList<>(List.of(
                new Person(1, "Developer", 35000),
                new Person(2, "Accountant", 40000),
                new Person(3, "Clerk", 20000),
                new Person(4, "Manager", 50000)
        ));
        List<Person> list2 = new ArrayList<>(List.of(
                new Person(1, "Developer", 40000),
                new Person(2, "Accountant", 35000),
                new Person(3, "Clerk", 22000),
                new Person(4, "Manager", 55000)
        ));
The list1 does not match the desired criteria while list2 matches the desired criteria.
Now I call the predicate method test -
System.out.println(hasSalaryOf40kAndIsDeveloper.test(list1));
System.out.println(hasSalaryOf40kAndIsDeveloper.test(list2));
Output -
true
true
Desired output -
false
true
Where am I going wrong and how to correct my code?
 
    