Praga en Java

Supoño que está falando de com.google.common.base.Predicate<T> da guava.
da API:

Determina a true ou false para unha entrada dada. Por exemplo, un RegexPredicate pode implementar Predicate<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)

Deixa unha resposta

O teu enderezo electrónico non se publicará Os campos obrigatorios están marcados con *