Je vais dans le code qui utilise le prédicat en Java. Je n’ai jamais utilisé prédicat. Quelqu'un peut me guider à n’importe quel tutoriel ou explication conceptuelle du prédicat et leur application en java ? Google n’a pas beaucoup d’aide...
Réponses
Trop de publicités?Je suppose que vous parlez com.google.common.base.Predicate<T>
de la Goyave.
À partir de l'API:
Détermine un
true
oufalse
de la valeur pour une entrée donnée. Par exemple, unRegexPredicate
pourrait mettre en oeuvrePredicate<String>
, et de retourner vrai pour n'importe quelle chaîne de caractères qui correspond à son expression régulière donnée.
Il s'agit essentiellement d'une programmation orientée objet, abstraction pour un boolean
de test.
Par exemple, vous pouvez avoir une aide de la méthode comme ceci:
static boolean isEven(int num) {
return (num % 2) == 0; // simple
}
Maintenant, étant donné un List<Integer>
, vous pouvez traiter uniquement les 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
, if
test est extrait comme un type. Cela lui permet d'interagir avec le reste de l'API, comme Iterables
, qui ont beaucoup de méthodes utilitaires qui prend Predicate
.
Ainsi, vous pouvez maintenant écrire 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);
}
Notez que maintenant, la boucle for-each est beaucoup plus simple sans le if
de test. Nous avons atteint un niveau plus élevé de abtraction en définissant Iterable<Integer> evenNumbers
, en filter
-ing à l'aide d'un Predicate
.
API liens
-
Iterables.filter
- Renvoie les éléments qui satisfont un prédicat.
Sur la fonction d'ordre supérieur
Predicate
permet Iterables.filter
pour servir de ce qu'on appelle une fonction d'ordre supérieur. Sur son propre, ce qui offre de nombreux avantages. Prendre l' List<Integer> numbers
exemple ci-dessus. Supposons que nous voulons tester si tous les nombres sont positifs. On peut é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 l'interopérabilité avec le reste de la bibliothèque, nous pouvons, au lieu d'é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!");
}
J'espère que vous pouvez maintenant voir la valeur dans les plus hautes abstractions pour des routines comme "filtre tous les éléments par le prédicat", "vérifier si tous les éléments satisfont le prédicat", etc faire pour un meilleur code.
Malheureusement, Java n'a pas de première classe de méthodes: vous ne pouvez pas passer méthodes autour d' Iterables.filter
et Iterables.all
. Vous pouvez, bien sûr, de passer autour des objets en Java. Ainsi, l' Predicate
type est défini, et vous passez des objets implémentant cette interface à la place.
Voir aussi
Un prédicat est une fonction qui renvoie une valeur true/false (c'est à dire boolean) de la valeur, par opposition à une proposition qui est un vrai/faux (c'est à dire boolean). En Java, on ne peut pas avoir autonome des fonctions, et donc on crée un prédicat par la création d'une interface pour un objet qui représente un prédicat et puis on fournit une classe qui implémente cette interface. Un exemple d'une interface pour un prédicat peut être:
public interface Predicate<ARGTYPE>
{
public boolean evaluate(ARGTYPE arg);
}
Et ensuite, vous pourriez avoir une mise en œuvre telles que:
public class Tautology<E> implements Predicate<E>
{
public boolean evaluate(E arg){
return true;
}
}
Pour obtenir une meilleure compréhension conceptuelle, vous voudrez peut-être lire à propos de la logique du premier ordre.
Modifier
Il y a une norme de Prédicat (interfacejava.util.fonction.Prédicat) définies dans l'API Java de Java 8. Avant Java 8, il peut être pratique de réutiliser le com.google.commun.de la base.Prédicat de l'interface à partir de Goyave.
Notez également que, comme de Java 8, il est beaucoup plus simple à écrire des prédicats en utilisant les lambdas. Par exemple, en Java 8 et plus, on peut passer p -> tru
à une fonction au lieu de définir un nommé sous-classe de la Tautologie comme ci-dessus.
Vous pouvez consulter les exemples de la doc de java ou l’exemple de l’utilisation du prédicat ici
Fondamentalement, il est utilisé pour filtrer les lignes dans le jeu de résultats basés sur des critères spécifiques que vous pouvez avoir et retournent la valeur true pour les lignes qui répondent à vos critères :
Ajoutant jusqu'à ce que Micheal a dit :
Vous pouvez utiliser prédicat comme suit dans le filtrage de collections en java :
un prédicat possible peut être :
Utilisation :