Example: how to add multiple filter condition in Java stream filter chain
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<Employee> employeeList = getEmployeesFromDataSource();
//filter 1
Predicate<Employee> isEmployeeActive = e -> e.getStatus() == EmployeeStatus.ACTIVE;
//filter2
Predicate<Employee> isAccountActive = e -> e.getAccount().getStatus() == AccountStatus.ACTIVE;
//Active employees
String result = employeeList.stream()
.filter(isEmployeeActive)
.map(e -> e.getId().toString())
.collect(Collectors.joining(",", "[", "]"));
System.out.println("Active employees = " + result);
//Active employees with active accounts
result = employeeList.stream()
.filter(isEmployeeActive.and(isAccountActive))
.map(e -> e.getId().toString())
.collect(Collectors.joining(",", "[", "]"));
System.out.println("Active employees with active accounts = " + result);
//Active employees with inactive accounts
result = employeeList.stream()
.filter(isEmployeeActive.and(isAccountActive.negate()))
.map(e -> e.getId().toString())
.collect(Collectors.joining(",", "[", "]"));
System.out.println("Active employees with inactive accounts = " + result);
//Inactive employees with inactive accounts
result = employeeList.stream()
.filter(isEmployeeActive.negate().and(isAccountActive.negate()))
.map(e -> e.getId().toString())
.collect(Collectors.joining(",", "[", "]"));
System.out.println("Inactive employees with inactive accounts = " + result);
}
private static List<Employee> getEmployeesFromDataSource() {
List<Employee> employeeList = new ArrayList<>();
employeeList.add(new Employee(1L, "A", "AA", EmployeeStatus.ACTIVE,
new Account(1001L, "Saving - 1001", "Saving", AccountStatus.ACTIVE)));
employeeList.add(new Employee(2L, "B", "BB", EmployeeStatus.ACTIVE,
new Account(1002L, "Checking - 1002", "Checking", AccountStatus.ACTIVE)));
employeeList.add(new Employee(3L, "C", "CC", EmployeeStatus.ACTIVE,
new Account(1003L, "Deposit - 1003", "Deposit", AccountStatus.ACTIVE)));
employeeList.add(new Employee(4L, "D", "DD", EmployeeStatus.ACTIVE,
new Account(1004L, "Saving - 1004", "Saving", AccountStatus.INACTIVE)));
employeeList.add(new Employee(5L, "E", "EE", EmployeeStatus.ACTIVE,
new Account(1005L, "Checking - 1005", "Checking", AccountStatus.INACTIVE)));
employeeList.add(new Employee(6L, "F", "FF", EmployeeStatus.ACTIVE,
new Account(1006L, "Deposit - 1006", "Deposit", AccountStatus.BLOCKED)));
return employeeList;
}
}