prêche en Java

Je suppose que vous parlez de com.google.common.base.Predicate<T> de la GUAVA.
de l’API:

détermine A true ou false pour une entrée donnée. Par exemple, un RegexPredicate pourrait mettre en œuvre Predicate<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)

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *