Predica in Java

Suppongo di parlare di com.google.common.base.Predicate<T> della guava.
dell’API:

Determina A true o false per un dato input. Ad esempio, un RegexPredicate potrebbe implementare Predicate<String> e diventa true per qualsiasi stringa che corrisponde alla sua espressione regolare fornita.

Questa è essenzialmente un’estrazione oop per un boolean test.
Ad esempio, puoi avere un metodo di aiuto come questo:

static boolean isEven(int num) { return (num % 2) == 0; // simple}

Ora, dato un List<Integer> È possibile elaborare solo i numeri coppie come questo:

 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 il if Il test è astratto come tipo. Ciò consente di interoperare con il resto dell’API, come Iterables che hanno molti metodi di utilità che richiedono Predicate. Entrambi, ora puoi Scrivi qualcosa del genere:

 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); }

Adesso che ora il loop di ciascuno è molto più semplice senza il test if Test . Abbiamo raggiunto un livello più alto di astrazione definendo di filtering usando un Predicate.

collegamenti API

  • Iterables.filter
    • restituisce gli elementi che soddisfano un predicato.

nella funzione ordine superiore

Predicate consente Iterables.filter per servire da ciò che viene chiamato una funzione di ordine superiore. Di per sé, questo offre molti vantaggi. Prendi il List<Integer> numbers Esempio precedente. Supponiamo che vogliamo controllare se tutti i numeri sono positivi. Possiamo scrivere qualcosa del genere:

static boolean isAllPositive(Iterable<Integer> numbers) { for (int number : numbers) { if (number <= 0) { return false; } } return true;}//...if (isAllPositive(numbers)) { System.out.println("Yep!");}

con un Predicate e interviato con il resto delle librerie, noi può scrivere questo:

Predicate<Integer> isPositive = new Predicate<Integer>() { @Override public boolean apply(Integer number) { return number > 0; } };//...if (Iterables.all(numbers, isPositive)) { System.out.println("Yep!");}

Speriamo che ora è possibile visualizzare il valore in astrazioni più elevate per routine come “Filtra tutti gli elementi del predicato indicato”, ” Se tutti gli elementi soddisfano il predicato dato “, ecc. Fanno un codice migliore. Purtroppo Java non ha metodi di prima classe: non puoi passare i metodi intorno a Iterables.filter e Iterables.all. Puoi, naturalmente, passare gli oggetti in Java. Pertanto, è definito il Predicate e gli oggetti vengono passati implementando questa interfaccia invece.

Vedi anche

  • wikipedia / superior funzione ordine
  • wikipedia / filtro (funzione superiore)

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *