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: p> 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> 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: p> 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. P> p>
3 Réponses :
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);
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.
Vous voulez probablement utiliser la fonction code> Filtre code>. 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: p> ici est Quelques matériel de lecture pour vous! Spécialement le "2.3 pour plusieurs conditions". Section. P> J'espère que cela aide! p> p>
Vous pouvez implémenter certaines fonctions de recherche pour chaque attribut, telle que
pour l'âge les filtres possibles pour le nom de famille Le filtre Vous pouvez ajouter quelque chose comme ci-dessous à votre classe d'employé: p> et une liste d'employé: p> filtrer par exemple tous les employés âgés de plus de 40 ans et femelle: p> supposer que votre demande est quelque chose comme? Âge> 40 & Male = Faux ... < / p> p> 'égaux' code>,
'supérieur à' code> ou
'inférieur à' p> p> p> p> P> P> li>
'est égal' code>,
'commence par' code> ou
'se termine par'. code> p> li>
'est masculin' code> li>
ul>
Créer
SET> code> 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 code> qui mappe ces cinq attributs (type) à un
Prédicate code> 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?