Presupun că vorbești despre com.google.common.base.Predicate<T>
al guvai.
API:
determină o
true
saufalse
pentru o intrare dată. De exemplu, unRegexPredicate
ar putea implementaPredicate<String>
și devine adevărat pentru orice șir care se potrivește cu expresia obișnuită dată.ID ID DIV = „5666EGE838″>
Aceasta este, în esență, o abstracție OOP pentru un test
. De exemplu, puteți avea o metodă de ajutor ca acesta:
static boolean isEven(int num) { return (num % 2) == 0; // simple}
acum, dat fiind un List<Integer>
puteți procesa numai numerele perechi ca acesta:
List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10); for (int number : numbers) { if (isEven(number)) { process(number); } }
cu Predicate
if
Testul este abstract ca un tip. Acest lucru vă permite să interoperați cu restul API, ca Iterables
care au multe metode de utilitate care necesită Predicate
. Ambele, acum puteți Scrieți ceva de genul acesta:
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); }
Vă rog acum că bucla fiecărui este mult mai simplă fără testul
EF88B3C87 „>
. Am ajuns la un nivel mai ridicat de abstractizare prin definirea Iterable<Integer> evenNumbers
bb78d16367 „>
folosind un Predicate
API Link-uri
-
Iterables.filter
- returnează elementele care îndeplinesc un predicat.
în funcția de ordine superioară
Predicate
permite Iterables.filter
pentru a servi ca ceea ce se numește o funcție de ordin superior. Prin ea însăși, acest lucru oferă multe avantaje. Luați exemplul anterior. Să presupunem că vrem să verificăm dacă toate numerele sunt pozitive. Putem scrie ceva de genul ăsta:
static boolean isAllPositive(Iterable<Integer> numbers) { for (int number : numbers) { if (number <= 0) { return false; } } return true;}//...if (isAllPositive(numbers)) { System.out.println("Yep!");}
cu un Predicate
și intervenind cu restul bibliotecilor, noi poate scrie acest lucru:
Predicate<Integer> isPositive = new Predicate<Integer>() { @Override public boolean apply(Integer number) { return number > 0; } };//...if (Iterables.all(numbers, isPositive)) { System.out.println("Yep!");}
sperăm că acum puteți vedea valoarea în abstracții mai mari pentru rutine, cum ar fi „Filtrați toate elementele de la predicatul dat”, „Verificați Dacă toate elementele satisfac predicatul dat „, etc. Ele fac un cod mai bun.
Din păcate, Java nu are metode de primă clasă: nu puteți trece metode în jurul valorii de Iterables.filter
și iv id = „F1891CCF75”
. Puteți, desigur, să treceți obiecte în Java. Prin urmare, este definită Predicate
și obiectele sunt adoptate prin implementarea acestei interfețe în schimb.
vezi și
- wikipedia / superioară Funcția de comandă
- wikipedia / filtru (funcția superioară)