100 votes

Prédicat en Java

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...

203voto

polygenelubricants Points 136838

Je suppose que vous parlez com.google.common.base.Predicate<T> de la Goyave.

À partir de l'API:

Détermine un true ou false de la valeur pour une entrée donnée. Par exemple, un RegexPredicate pourrait mettre en oeuvre Predicate<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


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

14voto

Michael Aaron Safyan Points 45071

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.

0voto

techzen Points 1165

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 :

0voto

HanuAthena Points 2760

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 :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X