Supoño que está falando de com.google.common.base.Predicate<T>
da guava.
da API:
Determina a
true
oufalse
para unha entrada dada. Por exemplo, unRegexPredicate
pode implementarPredicate<String>
e faise certo para calquera cadea que coincida coa súa expresión regular dada.
Esta é esencialmente unha abstracción de OOP para unha proba boolean
.
Por exemplo, pode ter un método de axuda como este:
static boolean isEven(int num) { return (num % 2) == 0; // simple}
Agora, deu un List<Integer>
pode procesar só os pares de números como este:
List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10); for (int number : numbers) { if (isEven(number)) { process(number); } }
con Predicate
o if
a proba resúmese como un tipo. Isto permítelle interoperar co resto da API, como Iterables
que ten moitos métodos de utilidade que requiren Predicate
. Ambos, agora pode Escribe algo así:
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); }
Por favor, agora que agora o bucle de cada un é moito máis sinxelo sen a proba if
.. Chegamos a un nivel superior de abstracción definindo por filter
-ing usando un Predicate
.
ligazóns API
-
Iterables.filter
- Devolve os elementos que cumpren un predicado.
na función de orde superior
Predicate
permite Iterables.filter
para servir como o que se chama unha función de orde superior. Por si só, isto ofrece moitas vantaxes. Tome o List<Integer> numbers
Exemplo anterior. Supoña que queremos comprobar se todos os números son positivos. Podemos escribir algo así:
static boolean isAllPositive(Iterable<Integer> numbers) { for (int number : numbers) { if (number <= 0) { return false; } } return true;}//...if (isAllPositive(numbers)) { System.out.println("Yep!");}
cun Predicate
e intervindo co resto das bibliotecas, nós pode escribir isto:
Predicate<Integer> isPositive = new Predicate<Integer>() { @Override public boolean apply(Integer number) { return number > 0; } };//...if (Iterables.all(numbers, isPositive)) { System.out.println("Yep!");}
Esperemos que agora poida ver o valor en abstraccións máis altas para rutinas como “Filtrar todos os elementos do predicado”, “Comprobe Se todos os elementos satisfán o predicado dado “, etc. Eles fan un código mellor.
Por desgraza Java non ten métodos de primeira clase: non pode pasar métodos en torno a Iterables.filter
e Iterables.all
. Pode, por suposto, pasar obxectos en Java. Polo tanto, o Predicate
está definido, e os obxectos son aprobados implementando esta interface no seu lugar.
Ver tamén
- Wikipedia / Superior Función de pedido
- Wikipedia / Filtro (función superior)