Predicar en Java

Assumeixo que estàs parlant de com.google.common.base.Predicate<T> de la Guayaba. Anunci De l’API:

Determina un true o false per a una entrada determinada. Per exemple, un RegexPredicate podria implementar Predicate<String> i es torna veritable per a qualsevol cadena que coincideixi amb la seva expressió regular donada.

Això és essencialment una abstracció d’OOP per a una boolean prova.
per exemple, pot tenir un mètode d’ajuda com aquest:

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

Ara, donada una List<Integer> pots processar només els números parells com aquest:

 List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10); for (int number : numbers) { if (isEven(number)) { process(number); } }

Amb Predicate el if la prova s’abstreu com un tipus. Això li permet interoperar amb la resta de l’API, com Iterables que tenen molts mètodes d’utilitat que requereixen Predicate. A Per tant, ara pots escriure alguna cosa com això:

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

Tingueu en compte que ara el bucle de cada un és molt més simple sense el if prova. Hem arribat a un nivell més alt de abtracción definint Iterable<Integer> evenNumbers per filter -ing usant un Predicate .

Enllaços API

  • Iterables.filter
    • Mostra els elements que satisfan un predicat.

En la funció d’ordre superior

Predicate permet Iterables.filter per servir com el que s’anomena una funció d’ordre superior. Per si mateix, això ofereix molts avantatges. Pren el List<Integer> numbers exemple anterior. Suposem que volem comprovar si tots els números són positius. Podem escriure alguna cosa com això:

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

Amb un Predicate i intervenint amb la resta de les biblioteques, podem escriure això:

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

Esperem que ara puguis veure el valor en abstraccions més altes per rutines com “filtrar tots els elements pel predicat donat”, “comprovar si tots els elements satisfan el predicat donat “, etc. fan un millor codi.
Malauradament Java no té mètodes de primera classe: no pots passar mètodes al voltant de Iterables.filter i Iterables.all. Pots, per descomptat, passar objectes en Java. Per tant, el Predicate es defineix el tipus, i es passa objectes implementant aquesta interfície al seu lloc.

Veure també

  • Wikipedia / funció d’ordre superior
  • Wikipedia / Filtre (funció d’ordre superior)

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *