Suppongo di parlare di com.google.common.base.Predicate<T>
della guava.
dell’API:
Determina A
true
ofalse
per un dato input. Ad esempio, unRegexPredicate
potrebbe implementarePredicate<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
ilif
Il test è astratto come tipo. Ciò consente di interoperare con il resto dell’API, comeIterables
che hanno molti metodi di utilità che richiedonoPredicate
. 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 difilter
ing usando unPredicate
.collegamenti API
Iterables.filter
- restituisce gli elementi che soddisfano un predicato.
nella funzione ordine superiore
Predicate
consenteIterables.filter
per servire da ciò che viene chiamato una funzione di ordine superiore. Di per sé, questo offre molti vantaggi. Prendi ilList<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
eIterables.all
. Puoi, naturalmente, passare gli oggetti in Java. Pertanto, è definito ilPredicate
e gli oggetti vengono passati implementando questa interfaccia invece.Vedi anche
- wikipedia / superior funzione ordine
- wikipedia / filtro (funzione superiore)