How to use Java 8 predicate
Las expresiones lambda son funciones anónimas, es decir que no necesitan una clase. Su sintaxis básica se muestra a continuación:
parámetros → {Cuerpo lambda}
A continuación, mostraré algunos ejemplos del uso de predicados utilizando funciones lambda. Recuerden que estas características sólo están disponibles en la versión 8 del JDK.
Predicado simple
Encadenamiento de predicados
Los predicados también puede ser encadenados entre sí utilizando conectores de tipo AND, OR y de negación como si de cualquier expresión lógica se tratase. A continuación, se muestra un ejemplo sencillo en donde se verifica, a través de dos predicados, que un número se encuentra en un rango determinado.
Predicados como argumentos de funciones
Java 8 también nos permite pasar predicados como argumentos de funciones. En el siguiente ejemplo, sólo vamos a permitir números que cumplan con la regla que es establecida como parámetro de la función procesar.
También podemos filtrar elementos de una lista utilizando predicados. El siguiente ejemplo lo ilutra:
parámetros → {Cuerpo lambda}
En caso de que el cuerpo lambda presenta más de una línea de código, será necesario incluir las llaves. En caso devuelva un valor, será necesario incluir también la cláusula return.
A continuación, mostraré algunos ejemplos del uso de predicados utilizando funciones lambda. Recuerden que estas características sólo están disponibles en la versión 8 del JDK.
Predicado simple
Representa una función con un único argumento cuyo valor de retorno será de tipo booleano. Aplicaremos este caso para verificar si un número es primo o no.
import java.util.function.Predicate; import java.util.stream.IntStream; /** * * @author Rolando */ public class Main { public static void main(String[] args) { System.out.println(isPrimo(1)); System.out.println(isPrimo(2)); System.out.println(isPrimo(3)); System.out.println(isPrimo(4)); } private static boolean isPrimo(final int numero) { Predicate<Integer> isDivisible = divisor -> numero % divisor == 0; return numero > 1 && IntStream.range(2, numero). noneMatch(index -> isDivisible.test(index)); } }
Encadenamiento de predicados
Los predicados también puede ser encadenados entre sí utilizando conectores de tipo AND, OR y de negación como si de cualquier expresión lógica se tratase. A continuación, se muestra un ejemplo sencillo en donde se verifica, a través de dos predicados, que un número se encuentra en un rango determinado.
import java.util.function.Predicate; /** * * @author Rolando */ public class Main { public static void main(String[] args) { System.out.println(isInRange(7, 2, 8)); System.out.println(isInRange(9, 11, 15)); } private static boolean isInRange(final int numero, final int limiteInferior, final int limiteSuperior) { Predicate<Integer> mayorNumero = i -> i >= limiteInferior; Predicate<Integer> menorNumero = i -> i <= limiteSuperior; return limiteSuperior >= limiteInferior && mayorNumero.and(menorNumero).test(numero); } }
Predicados como argumentos de funciones
Java 8 también nos permite pasar predicados como argumentos de funciones. En el siguiente ejemplo, sólo vamos a permitir números que cumplan con la regla que es establecida como parámetro de la función procesar.
import java.util.function.Predicate; /** * * @author Rolando */ public class Main { public static void main(String[] args) { procesar(11, (i) -> i > 10); procesar(9, (i) -> i % 3 == 0); } /** * Función que recibe un predicado como parámetro * * @param number * @param predicate */ static void procesar(int number, Predicate<Integer> predicate) { if (predicate.test(number)) { System.out.println("Número " + number + " ha sido aceptado!"); } } }
También podemos filtrar elementos de una lista utilizando predicados. El siguiente ejemplo lo ilutra:
import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; /** * * @author Rolando */ public class Main { public static void main(String[] args) { List<Usuario> users = new ArrayList<>(); users.add(new Usuario("John", "admin")); users.add(new Usuario("Peter", "member")); List<Usuario> lstAdministradores = process(users, (u) -> u.getUsuario().equals("admin")); System.out.println(lstAdministradores.size()); } static List<Usuario> process(List<Usuario> users, Predicate<Usuario> predicate) { List<Usuario> result = new ArrayList<>(); for (Usuario user : users) { if (predicate.test(user)) { result.add(user); } } return result; } } class Usuario { private String nombre; private String usuario; public Usuario(String nombre, String usuario) { this.nombre = nombre; this.usuario = usuario; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public String getUsuario() { return usuario; } public void setUsuario(String usuario) { this.usuario = usuario; } }
Comentarios
Publicar un comentario