Je suppose que vous parlez de com.google.common.base.Predicate<T>
de la GUAVA.
de l’API:
détermine A
true
oufalse
pour une entrée donnée. Par exemple, unRegexPredicate
pourrait mettre en œuvrePredicate<String>
et devient vrai pour toute chaîne correspondant à son expression régulière donnée.Ceci est essentiellement une abstraction de OOP pour un
boolean
Test.
Par exemple, vous pouvez avoir une méthode d’aide que ceci:static boolean isEven(int num) { return (num % 2) == 0; // simple}
maintenant, étant donné A
List<Integer>
Vous pouvez traiter uniquement les paires de nombres comme ceci:List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10); for (int number : numbers) { if (isEven(number)) { process(number); } }
avec
Predicate
« ID DIV = » EF88B3CA87 « >
Le test est abstrait comme un type. Cela vous permet d’interagérer avec le reste de l’API, comme Iterables
qui nécessite de nombreuses méthodes utilitaires nécessitant Predicate
. Tous les deux, maintenant, maintenant, tu peux Écrivez quelque chose comme ceci:
Predicate<Integer> isEven = new Predicate<Integer>() { @Override public boolean apply(Integer number) { return (number % 2) == 0; } }; Iterable<Integer> evenNumbers = Iterables.filter(numbers, isEven); for (int number : evenNumbers) { process(number); }
S’il vous plaît maintenant que maintenant la boucle de chacun est beaucoup plus simple sans le if
Test . Nous avons atteint un niveau d’abstraction plus élevé en définissant Iterable<Integer> evenNumbers
par filter
-ing à l’aide d’un Predicate
.
Liens API
-
Iterables.filter
- renvoie les éléments qui répondent à un prédicat.
dans la fonction de commande supérieure
Predicate
permet Iterables.filter
servir comme ce qu’on appelle une fonction d’ordre supérieur. En soi, cela offre de nombreux avantages. Prenez le List<Integer> numbers
Exemple précédent. Supposons que nous voulions vérifier si tous les chiffres sont positifs. Nous pouvons écrire quelque chose comme ceci:
static boolean isAllPositive(Iterable<Integer> numbers) { for (int number : numbers) { if (number <= 0) { return false; } } return true;}//...if (isAllPositive(numbers)) { System.out.println("Yep!");}
avec un Predicate
et intervenant avec le reste des bibliothèques, nous peut écrire ceci:
Predicate<Integer> isPositive = new Predicate<Integer>() { @Override public boolean apply(Integer number) { return number > 0; } };//...if (Iterables.all(numbers, isPositive)) { System.out.println("Yep!");}
Espérons que vous pouvez maintenant voir la valeur dans des abstractions plus élevées pour les routines telles que « Filtrer tous les éléments par le prédicat donné », » Si tous les éléments satisfont au prédicat donné « , etc. Ils font un meilleur code.
Malheureusement, Java n’a pas de méthodes de première classe: vous ne pouvez pas passer des méthodes autour de Iterables.filter
et . Vous pouvez bien sûr passer des objets en Java. Par conséquent, le Predicate
est défini et les objets sont passés en implémentant cette interface à la place.
Voir aussi
- Wikipedia / Supérieur Fonction de commande
- wikipedia / filtre (fonction supérieure)