Eu suponho que você está falando sobre com.google.common.base.Predicate<T>
da goiaba.
da API:
determina um
true
oufalse
para uma determinada entrada. Por exemplo, umRegexPredicate
pode implementarPredicate<String>
e se torna verdadeira para qualquer string que corresponda à sua expressão regular dada.
Isto é essencialmente uma abstração OOP para um teste boolean
.
Por exemplo, você pode ter um método de ajuda como este:
static boolean isEven(int num) { return (num % 2) == 0; // simple}
agora, dado a List<Integer>
você pode processar apenas os pares de números assim:
List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10); for (int number : numbers) { if (isEven(number)) { process(number); } }
com Predicate
O if
O teste é abstraído como um tipo. Isso permite que você interopere com o restante da API, como Iterables
que possuem muitos métodos de utilidade que exigem Predicate
. Ambos, agora você pode Escreva algo assim:
Por favor, agora que agora o loop de cada um é muito mais simples sem o teste if
. Chegamos a um nível mais alto de abstração definindo Iterable<Integer> evenNumbers
por filter
-ing usando um Predicate
.
links de API
-
Iterables.filter
- retorna os elementos que atendem a um predicado.
Na função de pedido superior
Predicate
permite Iterables.filter
para servir como o que é chamado de função de ordem superior. Por si só, isso oferece muitas vantagens. Tome o exemplo List<Integer> numbers
Anterior. Suponha que desejemos verificar se todos os números são positivos. Podemos escrever algo assim:
static boolean isAllPositive(Iterable<Integer> numbers) { for (int number : numbers) { if (number <= 0) { return false; } } return true;}//...if (isAllPositive(numbers)) { System.out.println("Yep!");}
com um Predicate
e intervir com o resto das bibliotecas, nós Pode escrever 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!");}
Espero que agora você possa ver o valor em maiores abstrações para rotinas, como “filtrar todos os elementos pelo predicado”, “, Se todos os elementos satisfarem o predicado dado “, etc. Eles fazem um código melhor. Infelizmente, o Java não possui métodos de primeira classe: você não pode passar métodos em torno de Iterables.filter
e Iterables.all
. Você pode, claro, passar objetos em Java. Portanto, o Predicate
é definido e os objetos são passados implementando essa interface.
veja também
- wikipedia / superior Função de pedido
- wikipedia / filtro (função superior)