web-dev-qa-db-fra.com

CollectionUtils en Java à l'aide d'un prédicat

J'ai un List<Object> et je veux renvoyer la première valeur trouvée vraie qui correspond à un prédicat. 

J'ai trouvé que je pouvais utiliser CollectionUtils.find(collection,predicate) (Apache commons). En supposant que la variable Object contient une variable entière appelée: value, comment puis-je spécifier dans le prédicat que la valeur peut être 1,2,3,4,5 et ignorer celles qui ne correspondent Est-il possible de faire "contient".

De plus, n'utilisant pas Java 8, je suis donc incapable de diffuser du contenu. 

11
Rory Lester

Pour retourner le premier élément de la liste qui correspond au prédicat donné:

MyObject res = CollectionUtils.find(myList, new Predicate<MyObject>() {
    @Override
    public boolean evaluate(MyObject o) {
        return o.getValue() >= 1 && o.getValue() <= 5;
    }
});

Pour filtrer la liste afin qu'elle ne contienne que des éléments correspondant au prédicat:

CollectionUtils.filter(myList, new Predicate<MyObject>() {
    @Override
    public boolean evaluate(MyObject o) {
        return o.getValue() >= 1 && o.getValue() <= 5;
    }
});

Vous pouvez remarquer que le Predicate<MyObject> est le même.

25
Jean Logeart

En Java 8, vous pouvez écrire

Optional<Integer> found = list.stream().filter(i -> i >= 1 && i <= 5).findAny();

Avant Java 7, la solution la plus simple consiste à utiliser une boucle.

Integer found = null;
for(integer i : list)
   if (i >= 1 && i <= 5) {
        found = i;
        break;
   }

Ce serait le moyen le plus propre et le plus rapide car Java 7 ne prend pas en charge les lambdas.

5
Peter Lawrey

Vous pouvez utiliser Collections.removeIf (je suppose que vous utilisez JDK 8). Vous pouvez également utiliser un flux:

list = list.stream().filter(predicate).collect(Collectors.toList());

En utilisant Apach Commons Collections, vous pouvez utiliser CollectionUtils.filter .

0
Dici