0
votes

Comment filtrer une liste d'objet par plusieurs champs en Java?

Je voudrais filtrer une liste d'objet par plusieurs champs, mais ces champs utilisés pour le filtrage peuvent changer. Par exemple;

supposons que nous avons une classe d'employé avec certaines propriétés: xxx

Quelle est la meilleure façon de coder une méthode qui filtre par parfois âge et sexe ou parfois seulement prénom? (Les échantillons peuvent être reproduits, c'est-à-dire pour cet exemple, il dispose de 5 propriétés, donc il y a 5! = 120 possibilités) Pourrait-il être codé à l'aide de Lambda ou autre chose en Java?

P.s. : Toute possibilités ne sont pas prédéfinies. Tout ce qui vient de la demande, il devrait filtrer par elle. Je crois que l'exemple ci-dessous rendra ce problème clair:

suppose que nous avons un objet de filtre avec les mêmes propriétés que celle des employés. Si l'âge est donné et que les autres sont nuls, ce service ne filtrera que par âge. Ou seulement le sexe et le prénom sont donnés, il devrait obtenir des employés par les critères.


5 commentaires

Créer SET > et choisissez un prédicat aléatoire à chaque fois que vous traitez le flux.


Quelles sont les combinaisons possibles? Sont-ils prédéfinis ou choisis dans un ordre aléatoire?


Les combinaisons possibles ne sont pas prédéfinies, cela pourrait être l'un des n! . En fait, je vais utiliser cela comme un service. Donc, quoi que ce soit vient de la demande, il devrait filtrer par elle.


Qu'est-ce qui vient de la demande?


@OKDuman Ouvrir à la définition d'un Enum qui mappe ces cinq attributs (type) à un Prédicate qui est spécifique au filtrage? Ou la condition de filtrer serait-elle également une partie de votre demande? Dans ce cas, il serait intéressant de savoir comment vous avez conçu votre objet de demande?


3 Réponses :


0
votes

Si vous savez ce que vous devez filtrer, vous pouvez combiner les prédicats. Disons que vous souhaitez filtrer les employés avec un prénom commençant par j code>, qui ont plus de 37 ans.

Predicate<Employee> p = e -> e.getFirstName().startsWith("J");
p = p.and(e -> e.getAge() > 37);


2 commentaires

En fait, c'est le point que nous ne sommes pas ce qui vient de la demande. C'est pourquoi il y a tellement de possibilités.


@OkDuman Vous voulez dire que les utilisateurs peuvent rechercher cependant ils peuvent penser, donner des possibilités infinies? Ensuite, vous ne serez pas capable de gérer cela avec des ruisseaux. Si vous avez au moins des termes de recherche prédéfinis, la quantité de prédicats est beaucoup plus petite.



0
votes

Vous voulez probablement utiliser la fonction Filtre . La façon dont cette fonction fonctionne est que, si votre expression évalue en vrai, elle le retournera au flux résultant.

Un échantillon d'échantillon serait: xxx

ici est Quelques matériel de lecture pour vous! Spécialement le "2.3 pour plusieurs conditions". Section.

J'espère que cela aide!


0 commentaires

0
votes

Vous pouvez implémenter certaines fonctions de recherche pour chaque attribut, telle que

  • pour l'âge les filtres possibles 'égaux' , 'supérieur à' ou 'inférieur à'

  • pour le nom de famille Le filtre 'est égal' , 'commence par' ou 'se termine par'.

  • pour le sexe 'est masculin'

    Vous pouvez ajouter quelque chose comme ci-dessous à votre classe d'employé: xxx

    et une liste d'employé: xxx

    filtrer par exemple tous les employés âgés de plus de 40 ans et femelle: xxx

    supposer que votre demande est quelque chose comme? Âge> 40 & Male = Faux ... < / p>


0 commentaires