Predicate en Java

je passe en revue le code qui utilise Predicate en Java. Je n'ai jamais utilisé Predicate . Quelqu'un peut-il me guider vers un tutoriel ou une explication conceptuelle de Predicate et son implémentation en Java?

95
demandé sur Xaerxess 2010-06-02 08:36:06

4 réponses

je suppose que vous parlez de com.google.common.base.Predicate<T> de goyave.

de L'API:

détermine une valeur true ou false pour une entrée donnée. Par exemple , un RegexPredicate pourrait implémenter Predicate<String> , et retourner true pour toute chaîne qui correspond à son expression régulière donnée.

C'est essentiellement une OOP abstraction pour un boolean test.

par exemple, vous pouvez avoir une méthode d'aide comme ceci:

static boolean isEven(int num) {
   return (num % 2) == 0; // simple
}

maintenant, avec un List<Integer> , vous pouvez traiter seulement les nombres pairs 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 , l'essai if est résumé en tant que type. Cela lui permet d'interopérer avec le reste de L'API, comme Iterables , qui ont de nombreuses méthodes d'utilité 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 pour chaque boucle est beaucoup plus simple sans le test if . Nous avons atteint un niveau plus élevé d'aberration en définissant Iterable<Integer> evenNumbers , par filter -ing en utilisant un Predicate .

API links


sur la fonction d'ordre supérieur

Predicate permet à Iterables.filter de servir ce qu'on appelle une fonction d'ordre supérieur. Sur son propre, ce qui offre de nombreux avantages. Prenez l'exemple List<Integer> numbers ci-dessus. Supposons que nous voulons tester si tous les nombres sont positifs. Nous pouvons écrire quelque chose comme ceci:

static boolean isAllPositive(Iterable<Integer> numbers) {
    for (Integer number : numbers) {
        if (number < 0) {
            return false;
        }
    }
    return true;
}

//...
if (isAllPositive(numbers)) {
    System.out.println("Yep!");
}

avec un Predicate , et en interférant avec le reste des bibliothèques, nous pouvons é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 les abstractions supérieures pour des routines comme "filtrer tous les éléments par le prédicat donné", "vérifier si tous les éléments satisfont le prédicat donné", etc faire pour un meilleur code.

malheureusement Java n'a pas de méthodes de première classe: vous ne pouvez pas passer méthodes autour de Iterables.filter et Iterables.all . Vous pouvez, bien sûr, passer autour de objets en Java. Ainsi, le type Predicate est défini, et vous passez objects implémentant cette interface à la place.

voir aussi

200
répondu polygenelubricants 2016-08-11 16:50:59

un prédicat est une fonction qui renvoie une valeur true/false (i.e. booléen), par opposition à une proposition qui est une valeur true/false (i.e. booléen). En Java, on ne peut pas avoir de fonctions autonomes, et donc on crée un prédicat en créant 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'interface pour un prédicat pourrait être:

public interface Predicate<ARGTYPE>
{
    public boolean evaluate(ARGTYPE arg);
}

Et alors vous pourriez avoir un mise en œuvre telle que:

public class Tautology<E> implements Predicate<E>
{
     public boolean evaluate(E arg){
         return true;
     }
}

pour obtenir une meilleure compréhension conceptuelle, vous pourriez vouloir lire à propos de la logique de premier ordre.

Modifier

Il existe une interface standard Predicate ( java.util.fonction.Prédicat ) défini dans L'API Java à partir de Java 8. Avant Java 8, Vous pouvez trouver pratique de réutiliser le COM.Google.commun.base.Prédicat interface de Guava .

aussi, notez qu'à partir de Java 8, Il est beaucoup plus simple d'écrire des prédicats en utilisant lambdas. Par exemple, en Java 8 et plus, on peut passer p -> true à une fonction au lieu de définir une sous-classe de tautologie nommée comme ci-dessus.

13
répondu Michael Aaron Safyan 2017-06-30 04:25:07

vous pouvez voir le java doc exemples ou l'exemple d'utilisation de Prédicate ici

fondamentalement, il est utilisé pour filtrer les lignes dans le jeu de résultats en fonction de tout critère spécifique que vous pouvez avoir et retourner vrai pour les lignes qui répondent à vos critères:

 // the age column to be between 7 and 10
    AgeFilter filter = new AgeFilter(7, 10, 3);

    // set the filter.
    resultset.beforeFirst();
    resultset.setFilter(filter);
0
répondu techzen 2010-06-02 04:44:38

additionnant à ce que Micheal a dit:

vous pouvez utiliser Predicate comme suit dans le filtrage des collections en java:

public static <T> Collection<T> filter(final Collection<T> target,
   final Predicate<T> predicate) {
  final Collection<T> result = new ArrayList<T>();
  for (final T element : target) {
   if (predicate.apply(element)) {
    result.add(element);
   }
  }
  return result;
}

un prédicat possible peut être:

final Predicate<DisplayFieldDto> filterCriteria = 
                    new Predicate<DisplayFieldDto>() {
   public boolean apply(final DisplayFieldDto displayFieldDto) {
    return displayFieldDto.isDisplay();
   }
  };

Utilisation:

 final List<DisplayFieldDto> filteredList=
 (List<DisplayFieldDto>)filter(displayFieldsList, filterCriteria);
0
répondu jai 2017-05-23 12:00:27