Realmente fue una maravilla cuando descubrí que con java.util.function.Predicate podía simplificar estas tediosas tareas repetitivas y hacer que mi código fuese más limpio. En serio te digo que, si vas a trabajar con validaciones, filtros o incluso lógica condicional compleja, esta herramienta será tu mano derecha. Voy a enseñarte a usarla de forma práctica, con ejemplos claros que podrás aplicar directamente en tus proyectos.

¿Qué es java.util.function.Predicate?
Esta interfaz es como un guardia de seguridad en una fiesta exclusiva. Él solo puede dejar entrar a quienes cumplen con ciertos criterios, como tener una invitación o estar en la lista de invitados. Entonces, java.util.function.Predicate (el guardia de seguridad) representa una función que toma un solo argumento y devuelve un valor booleano (true o false). Básicamente, es como un «filtro» que decide si un objeto cumple con ciertos criterios.
Algo que no puedes olvidar es que, esta interfaz suele usarse en operaciones con flujos o streams y también con colecciones, para filtrar elementos basándose en ciertas condiciones. Prácticamente tú le vas a decir al programa: «De todos estos elementos que te doy, selecciona solo los que pasen esta prueba«.
Métodos principales de Predicate
Además de test(), que es su método principal y evalúa la condición sobre un argumento, Predicate tiene varios métodos útiles que facilitan la creación de condiciones más complejas:
- and(): Combina dos condiciones con un operador lógico AND.
- or(): Combina dos condiciones con un operador lógico OR.
- negate(): Invierte el resultado de una condición.
- isEqual(): Verifica si un valor es igual a otro.
Conoce los usos prácticos de Predicate: Ejemplos
No voy a andar con muchos rodeos y voy a ir directamente con los ejemplos que puedes aplicar en diferentes escenarios.
Validación de contraseñas
Supongamos que estás desarrollando un sistema de registro de usuarios y necesitas validar contraseñas.
import java.util.function.Predicate;
public class PasswordValidation {
public static void main(String[] args) {
Predicate<String> hasUpperCase = password -> password.chars().anyMatch(Character::isUpperCase);
Predicate<String> hasDigit = password -> password.chars().anyMatch(Character::isDigit);
Predicate<String> isLongEnough = password -> password.length() >= 8;
Predicate<String> isValidPassword = hasUpperCase.and(hasDigit).and(isLongEnough);
String password = "KeepCoding123";
System.out.println("¿Es válida la contraseña? " + isValidPassword.test(password)); // Resultado: true
}
}
¿Te diste cuenta? Aquí usé and() para combinar tres condiciones: que la contraseña tenga al menos una mayúscula, un número y una longitud mínima.
Filtro de productos en una tienda
En un sistema de comercio electrónico, podrías filtrar productos según múltiples criterios, como disponibilidad y precio.
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
class Product {
String name;
double price;
boolean isAvailable;
Product(String name, double price, boolean isAvailable) {
this.name = name;
this.price = price;
this.isAvailable = isAvailable;
}
@Override
public String toString() {
return name + " - $" + price + " - Disponible: " + isAvailable;
}
}
public class ProductFilter {
public static void main(String[] args) {
List<Product> products = List.of(
new Product("Laptop", 1200, true),
new Product("Smartphone", 800, false),
new Product("Tablet", 600, true)
);
Predicate<Product> isAffordable = product -> product.price <= 1000;
Predicate<Product> isAvailable = product -> product.isAvailable;
List<Product> filteredProducts = products.stream()
.filter(isAffordable.and(isAvailable))
.collect(Collectors.toList());
filteredProducts.forEach(System.out::println);
}
}
En este ejemplo te mostré cómo usar Predicate para filtrar productos que son asequibles y están disponibles.
Eliminación de elementos no válidos en una lista
Lo bueno es que también puedes usar Predicate para limpiar listas de datos, como eliminar valores nulos o vacíos.
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class DataCleaner {
public static void main(String[] args) {
List<String> data = List.of("Java", null, "", "KeepCoding", " ");
Predicate<String> isValid = item -> item != null && !item.trim().isEmpty();
List<String> cleanedData = data.stream()
.filter(isValid)
.collect(Collectors.toList());
System.out.println(cleanedData); // Resultado: [Java, KeepCoding]
}
}
Con este ejemplo, eliminas valores nulos o cadenas vacías de una lista de datos.
Validación de edad para acceso a servicios
Un uso clásico de Predicate es validar edades mínimas para acceder a servicios específicos. Obsérvalo bien porque seguro en algún momento lo necesitarás:
import java.util.function.Predicate;
public class AgeValidation {
public static void main(String[] args) {
Predicate<Integer> isAdult = age -> age >= 18;
System.out.println("¿Tiene acceso un usuario de 16 años? " + isAdult.test(16)); // Resultado: false
System.out.println("¿Tiene acceso un usuario de 21 años? " + isAdult.test(21)); // Resultado: true
}
}
Mira que este enfoque es directo y muy útil en aplicaciones que dependen de reglas claras para acceso.
Verificación de números primos
Recuerda que también puedes usar Predicate para verificar si un número es primo.
import java.util.function.Predicate;
import java.util.stream.IntStream;
public class PrimeCheck {
public static void main(String[] args) {
Predicate<Integer> isPrime = num -> num > 1 &&
IntStream.range(2, num).noneMatch(i -> num % i == 0);
System.out.println("¿Es 7 un número primo? " + isPrime.test(7)); // Resultado: true
System.out.println("¿Es 10 un número primo? " + isPrime.test(10)); // Resultado: false
}
}
Aquí usé Predicate para encapsular la lógica de verificación, haciéndola reutilizable y clara.
Como has visto, java.util.function.Predicate es una gran herramienta para manejar validaciones y filtros en proyectos Java de cualquier tamaño. Si te apasiona escribir código más limpio y eficiente, en el Bootcamp de Java Full Stack de KeepCoding aprenderás todas estas herramientas y muchas más. ¡Inscríbete hoy y transforma tu carrera IT en muy poco tiempo!