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?
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
oufalse
pour une entrée donnée. Par exemple , unRegexPredicate
pourrait implémenterPredicate<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
-
Iterables.filter
- renvoie les éléments qui satisfaire un prédicat.
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
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.
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);
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);