Java-Critères de recherche sur la liste des classes définies par l'utilisateur


J'ai une classe SearchCriteria POJO

public class SearchCriteria{

private int empId;
private String empName;
private String empAddress;
private String empDesignation,
:
: 
//getter + setters
}

J'ai une méthode returnAllEmployees dans une autre classe

public List<Employees> returnAllEmployees (){
// makes a db call which has lot of joins and returns info for all the employees
}

Maintenant, ma question est que je dois filtrer le résultat de returnAllEmployees() en fonction des critères de recherche passés, c'est-à-dire si le champ empName de searchcriteria est rempli comme "ABC", la liste de filtres doit contenir les détails de tous les employés comme ABC.

De même, si les critères de recherche contiennent empName= " ABC " et empDesignation="engineer", il doit filtrer la liste contenant tous les employés ayant le nom abc et la désignation comme ingénieur

Je sais que c'est possible en utilisant if-else mais cela créerait beaucoup de lignes de codes

Author: Sunny, 2015-01-31

1 answers

Votre meilleure solution consiste à utiliser des flux Java 8. Ils sont parfaits pour cela:

List<Employee> listOfEngineersCalledFred = getAllEmployees().stream()
    .filter(emp -> emp.getName().equals("Fred"))
    .filter(emp -> emp.getDesignation().equals("Engineer"))
    .collect(Collectors.toList());

Une technique que je trouve personnellement utile et soignée consiste à ajouter des méthodes statiques qui renvoient des prédicats au lieu d'utiliser des getters:

class Employee {
    public static Predicate<Employee> hasName(String name) {
        return emp -> emp.name.equals(name);
    }
}

Ceux-ci peuvent ensuite être utilisés, par exemple, pour trouver tous les employés qui n'appellent pas Fred:

streamAllEmployees()
    .filter(Employee.hasName("Fred").negate())
    ...

Ce qui semble plus propre et plus délibéré que d'exposer le champ avec un getter.

Vous pouvez également envisager de convertir votre getAllEmployees en streamAllEmployees:

public Stream<Employee> streamAllEmployees() {
    return employeeList.stream();
}

Ensuite, vous dites à l'utilisateur qu'il peut faire des choses avec les objets employee dans la liste plutôt que la liste elle-même.

La bonne chose à propos de le renvoyer en tant que flux est qu'une fois que vous l'avez filtré, vous pouvez facilement compter, regrouper, trier, supprimer les doublons, obtenir le premier n, etc. Vous pouvez même trivialement convertir en utiliser plusieurs threads si vous filtrez un grand nombre d'éléments.

Par exemple:

Map<String, Employee> employeesByDesignation = streamAllEmployees()
    .collect(Collectors.groupingBy(emp -> emp.getDesignation()));

Ils sont très puissants et méritent d'être utiliser.

 1
Author: sprinter, 2015-01-31 07:31:31