у вас может быть класс SearchFilter
, который будет содержать все ваши поля фильтра, такие как searchToken
, fname
и т. Д., И еще один Condition
, например:
class Condition {
private Predicate<SearchFilter> searchFilterPredicate;
private Function<SearchFilter, Predicate<Employee>> function;
}
тогда вы можете определить статический неизменяемый список со всеми условиями:
List<Condition> conditions = Arrays.asList(
new Condition(sf -> sf.getSearchToken() != null,
sf -> emp -> emp.getFName().equalsIgnoreCase(sf.getSearchToken()) && emp.getLName().equalsIgnoreCase(sf.getSearchToken())),
new Condition(sf -> ObjectUtils.allNotNull(sf.getFname(), sf.getLname(), sf.getType()),
sf -> emp-> emp.getFName().equalsIgnoreCase(sf.getFname()) && emp.getLName().equalsIgnoreCase(sf.getLname()) && emp.getType().equalsIgnoreCase(sf.getType()))
//...
);
и, наконец, retrieveEmployees
метод
public List<Employee> retrieveEmployees(String searchToken, String fname, String lname, String type){
List<Employee> employees = getEmployees();
SearchFilter searchFilter = new SearchFilter(searchToken, fname, lname, type);
Optional<Predicate<Employee>> firstCondition = conditions.stream()
.filter(condition -> condition.getSearchFilterPredicate().test(searchFilter))
.findFirst()
.map(condition -> condition.getFunction().apply(searchFilter));
return firstCondition.map(employeePredicate -> employees.stream()
.filter(employeePredicate)
.collect(Collectors.toList()))
.orElse(employees);
}
Другое решение может проверять каждое поле фильтра и добавлять его для предиката
List<Employee> retrieveEmployees(String searchToken, String fname, String lname, String type){
List<Employee> employees = getEmployees();
if(searchToken != null) {
return employees
.stream()
.filter(emp -> emp.getFName().equalsIgnoreCase(searchToken) && emp.getLName().equalsIgnoreCase(searchToken))
.collect(Collectors.toList());
}
Predicate<Employee> predicate = employee -> true;
if(type != null) {
predicate = predicate.and(emp -> emp.getType().equalsIgnoreCase(type));
}
if(lname != null) {
predicate = predicate.and(emp -> emp.getLName().equalsIgnoreCase(lname));
}
if(fname != null) {
predicate = predicate.and(emp -> emp.getFName().equalsIgnoreCase(fname));
}
return employees.stream()
.filter(predicate)
.collect(Collectors.toList());
}