Assumeixo que estàs parlant de com.google.common.base.Predicate<T>
de la Guayaba. Anunci De l’API:
Determina un
true
ofalse
per a una entrada determinada. Per exemple, unRegexPredicate
podria implementarPredicate<String>
i es torna veritable per a qualsevol cadena que coincideixi amb la seva expressió regular donada.
Això és essencialment una abstracció d’OOP per a una boolean
prova.
per exemple, pot tenir un mètode d’ajuda com aquest:
static boolean isEven(int num) { return (num % 2) == 0; // simple}
Ara, donada una List<Integer>
pots processar només els números parells com aquest:
List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10); for (int number : numbers) { if (isEven(number)) { process(number); } }
Amb Predicate
el if
la prova s’abstreu com un tipus. Això li permet interoperar amb la resta de l’API, com Iterables
que tenen molts mètodes d’utilitat que requereixen Predicate
. A Per tant, ara pots escriure alguna cosa com això:
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); }
Tingueu en compte que ara el bucle de cada un és molt més simple sense el if
prova. Hem arribat a un nivell més alt de abtracción definint Iterable<Integer> evenNumbers
per filter
-ing usant un Predicate
.
Enllaços API
-
Iterables.filter
- Mostra els elements que satisfan un predicat.
En la funció d’ordre superior
Predicate
permet Iterables.filter
per servir com el que s’anomena una funció d’ordre superior. Per si mateix, això ofereix molts avantatges. Pren el List<Integer> numbers
exemple anterior. Suposem que volem comprovar si tots els números són positius. Podem escriure alguna cosa com això:
static boolean isAllPositive(Iterable<Integer> numbers) { for (int number : numbers) { if (number <= 0) { return false; } } return true;}//...if (isAllPositive(numbers)) { System.out.println("Yep!");}
Amb un Predicate
i intervenint amb la resta de les biblioteques, podem escriure això:
Predicate<Integer> isPositive = new Predicate<Integer>() { @Override public boolean apply(Integer number) { return number > 0; } };//...if (Iterables.all(numbers, isPositive)) { System.out.println("Yep!");}
Esperem que ara puguis veure el valor en abstraccions més altes per rutines com “filtrar tots els elements pel predicat donat”, “comprovar si tots els elements satisfan el predicat donat “, etc. fan un millor codi.
Malauradament Java no té mètodes de primera classe: no pots passar mètodes al voltant de Iterables.filter
i Iterables.all
. Pots, per descomptat, passar objectes en Java. Per tant, el Predicate
es defineix el tipus, i es passa objectes implementant aquesta interfície al seu lloc.
Veure també
- Wikipedia / funció d’ordre superior
- Wikipedia / Filtre (funció d’ordre superior)