Estoy revisando el código que se usa Predicateen Java. Nunca lo he usado Predicate. ¿Alguien puede guiarme a algún tutorial o explicación conceptual Predicatey su implementación en Java?
Determina un valor trueo falsepara una entrada determinada. Por ejemplo, a RegexPredicatepodría implementar Predicate<String>y devolver verdadero para cualquier cadena que coincida con su expresión regular dada.
Esto es esencialmente una abstracción OOP para una booleanprueba.
Por ejemplo, puede tener un método auxiliar como este:
Ahora, dado un List<Integer>, puede procesar solo los números pares 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, la ifprueba se abstrae como un tipo. Esto le permite interoperar con el resto de la API, por ejemplo Iterables, que tiene muchos métodos de utilidad que toma Predicate.
Por lo tanto, ahora puede escribir algo como esto:
Tenga en cuenta que ahora el ciclo for-each es mucho más simple sin la ifprueba. Hemos alcanzado un nivel más alto de abtracción al definir Iterable<Integer> evenNumbers, al filterutilizar un Predicate.
Devuelve los elementos que satisfacen un predicado.
En función de orden superior
Predicatepermite Iterables.filterservir como lo que se llama una función de orden superior. Por sí solo, esto ofrece muchas ventajas. Tome el List<Integer> numbersejemplo anterior. Supongamos que queremos probar si todos los números son positivos. Podemos escribir algo como esto:
staticboolean isAllPositive(Iterable<Integer> numbers){for(Integer number : numbers){if(number <0){returnfalse;}}returntrue;}//...if(isAllPositive(numbers)){System.out.println("Yep!");}
Con a Predicate, e interoperando con el resto de las bibliotecas, podemos escribir esto:
Predicate<Integer> isPositive =newPredicate<Integer>(){@Overridepublicboolean apply(Integer number){return number >0;}};//...if(Iterables.all(numbers, isPositive)){System.out.println("Yep!");}
Es de esperar que ahora pueda ver el valor en abstracciones más altas para rutinas como "filtrar todos los elementos por el predicado dado", "comprobar si todos los elementos satisfacen el predicado dado", etc. para mejorar el código.
Desafortunadamente, Java no tiene métodos de primera clase: no puede pasar métodos a Iterables.filtery Iterables.all. Por supuesto, puede pasar objetos en Java. Por lo tanto, el Predicatetipo está definido y, en su lugar, pasa objetos que implementan esta interfaz.
No me refería al predicado de Guava, debería haber sido claro en mi pregunta, pero su explicación me ayudó a entender lo que estaba buscando, la forma en que se usa la lógica de predicados en Java. Gracias por la explicación elaborada
srikanth
@polygenelubricants, ¿Por qué inventar Predicate<Integer>cuando ya tenemos F<Integer, Boolean>cuál hace exactamente lo mismo?
Pacerier
También puede hacerlo a la manera de Java 8: List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); Predicate<Integer> isEven = integer -> (integer % 2) == 0; Iterable<Integer> evenNumbers = numbers.stream().filter(isEven).collect(Collectors.toList());
14
Un predicado es una función que devuelve un valor verdadero / falso (es decir, booleano), a diferencia de una proposición que es un valor verdadero / falso (es decir, booleano). En Java, no se pueden tener funciones independientes, por lo que se crea un predicado creando una interfaz para un objeto que representa un predicado y luego se proporciona una clase que implementa esa interfaz. Un ejemplo de una interfaz para un predicado podría ser:
Además, tenga en cuenta que a partir de Java 8, es mucho más sencillo escribir predicados utilizando lambdas. Por ejemplo, en Java 8 y superior, se puede pasar p -> truea una función en lugar de definir una subclase de Tautología con nombre como la anterior.
Puede ver los ejemplos de java doc o el ejemplo de uso de Predicate aquí
Básicamente, se utiliza para filtrar filas en el conjunto de resultados en función de cualquier criterio específico que pueda tener y devolver verdadero para aquellas filas que cumplen con sus criterios:
// the age column to be between 7 and 10AgeFilter filter =newAgeFilter(7,10,3);// set the filter.
resultset.beforeFirst();
resultset.setFilter(filter);
Puede usar Predicate de la siguiente manera en el filtrado de colecciones en java:
publicstatic<T>Collection<T> filter(finalCollection<T> target,finalPredicate<T> predicate){finalCollection<T> result =newArrayList<T>();for(final T element : target){if(predicate.apply(element)){
result.add(element);}}return result;}
¿No derrota eso básicamente el propósito? La razón principal para elegir un enfoque funcional es NO iterar manualmente y deshacerse del for. El nivel de abstracción se vuelve más alto y más poderoso; sin embargo, hacer el for manualmente anula ese propósito y vuelve a la abstracción de bajo nivel.
Predicate
? ¿Algo parecido? ¿Algo completamente diferente?Predicate
Respuestas:
Supongo que estás hablando
com.google.common.base.Predicate<T>
de Guava.Desde la API:
Esto es esencialmente una abstracción OOP para una
boolean
prueba.Por ejemplo, puede tener un método auxiliar como este:
Ahora, dado un
List<Integer>
, puede procesar solo los números pares como este:Con
Predicate
, laif
prueba se abstrae como un tipo. Esto le permite interoperar con el resto de la API, por ejemploIterables
, que tiene muchos métodos de utilidad que tomaPredicate
.Por lo tanto, ahora puede escribir algo como esto:
Tenga en cuenta que ahora el ciclo for-each es mucho más simple sin la
if
prueba. Hemos alcanzado un nivel más alto de abtracción al definirIterable<Integer> evenNumbers
, alfilter
utilizar unPredicate
.Enlaces API
Iterables.filter
En función de orden superior
Predicate
permiteIterables.filter
servir como lo que se llama una función de orden superior. Por sí solo, esto ofrece muchas ventajas. Tome elList<Integer> numbers
ejemplo anterior. Supongamos que queremos probar si todos los números son positivos. Podemos escribir algo como esto:Con a
Predicate
, e interoperando con el resto de las bibliotecas, podemos escribir esto:Es de esperar que ahora pueda ver el valor en abstracciones más altas para rutinas como "filtrar todos los elementos por el predicado dado", "comprobar si todos los elementos satisfacen el predicado dado", etc. para mejorar el código.
Desafortunadamente, Java no tiene métodos de primera clase: no puede pasar métodos a
Iterables.filter
yIterables.all
. Por supuesto, puede pasar objetos en Java. Por lo tanto, elPredicate
tipo está definido y, en su lugar, pasa objetos que implementan esta interfaz.Ver también
fuente
Predicate<Integer>
cuando ya tenemosF<Integer, Boolean>
cuál hace exactamente lo mismo?List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); Predicate<Integer> isEven = integer -> (integer % 2) == 0; Iterable<Integer> evenNumbers = numbers.stream().filter(isEven).collect(Collectors.toList());
Un predicado es una función que devuelve un valor verdadero / falso (es decir, booleano), a diferencia de una proposición que es un valor verdadero / falso (es decir, booleano). En Java, no se pueden tener funciones independientes, por lo que se crea un predicado creando una interfaz para un objeto que representa un predicado y luego se proporciona una clase que implementa esa interfaz. Un ejemplo de una interfaz para un predicado podría ser:
Y luego podría tener una implementación como:
Para obtener una mejor comprensión conceptual, es posible que desee leer sobre lógica de primer orden.
Editar
Existe una interfaz Predicate estándar ( java.util.function.Predicate ) definida en la API de Java a partir de Java 8. Antes de Java 8, puede que le resulte conveniente reutilizar la interfaz com.google.common.base.Predicate de Guayaba .
Además, tenga en cuenta que a partir de Java 8, es mucho más sencillo escribir predicados utilizando lambdas. Por ejemplo, en Java 8 y superior, se puede pasar
p -> true
a una función en lugar de definir una subclase de Tautología con nombre como la anterior.fuente
Puede ver los ejemplos de java doc o el ejemplo de uso de Predicate aquí
Básicamente, se utiliza para filtrar filas en el conjunto de resultados en función de cualquier criterio específico que pueda tener y devolver verdadero para aquellas filas que cumplen con sus criterios:
fuente
Añadiendo a lo que ha dicho Micheal :
Puede usar Predicate de la siguiente manera en el filtrado de colecciones en java:
un posible predicado puede ser:
Uso:
fuente