¿Qué es computeIfAbsent en Java y cómo puedes sacarle provecho?

| Última modificación: 8 de octubre de 2024 | Tiempo de Lectura: 3 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

¿Sabes qué es computeIfAbsent en Java?

Trabajar en Java a veces puede convertirse en algo caótico, eso todos lo sabemos. Pese a ser el lenguaje de programación más popular, a veces no es el más práctico o fácil de aprender, especialmente si trabajas con el Map y necesitas comprobar si una clave existe y, si no lo hace añadir un valor para esa clave. Este tipo de operaciones pueden ser un poco repetitivas, pero afortunadamente Java 8 (que nos ha salvado de muchas) introdujo una manera más simple de realizar este tipo de tareas automáticas mediante el método computerIfAbsent. El día de hoy queremos explicarte en qué consiste este método y cómo sacarle el mayor provecho en tus apps.

computeifAbsent  java
Imagen: Medium

¿Qué es computeIfAbsent?

El método computeIfAbsent, que se añadió en Java 8, es súper útil cuando trabajas con mapas. Lo que hace es ahorrarte el trabajo de tener que verificar manualmente si una clave ya tiene un valor asignado antes de añadirle uno nuevo. Básicamente, lo que hace este método es calcular y asignar un valor automáticamente si esa clave aún no existe en el mapa, así se evita la constante repetición del mismo bloque de código para hacer esta comprobación.

La firma del método se hace del siguiente modo:

V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)

Donde:

  • key: es la clave para la que quieres calcular el valor.
  • mappingFunction: es una función que se ejecutará solo si no existe un valor para la clave. Este valor se asigna al mapa y se devuelve.

¿Cómo funciona computeIfAbsent?

El método computeIfAbsent primero comprueba si la clave proporcionada ya tiene un valor asociado en el mapa. Si el valor es null (o no está presente), ejecuta la función mappingFunction para calcular un nuevo valor y lo inserta en el mapa. Si la clave ya tiene un valor asignado, no hace nada.

Veamos un ejemplo:

Tenemos un Map que almacena nombres de documentos y su contenido. Queremos asegurarnos de que un documento se añada solo si no está ya presente:

Map<String, Documento> cache = new HashMap<>();
cache.put("java", new Documento("java", "java es un lenguaje de programación"));

Documento documento = cache.computeIfAbsent("python", k -> new Documento(k, "python es un lenguaje versátil"));

System.out.println(documento.getNombre()); // Imprime "python"

En este ejemplo el documento “python” no estaba en la cache, por lo que computeIfAbsent crea un nuevo documento y lo añade al mapa.

¿En qué contexto podemos usar el computeIfAbsent?

  • Implementación de una cache: Uno de los usos más comunes de computeIfAbsent es la implementación de una cache. Imagina que tienes una aplicación donde necesitas cargar archivos de un sistema remoto. Puedes utilizar una cache para evitar volver a cargar archivos que ya has descargado:
Map<String, Documento> cacheDocumentos = new HashMap<>();

public Documento obtenerDocumento(String nombre) {
return cacheDocumentos.computeIfAbsent(nombre, k -> cargarDocumentoDesdeSistemaRemoto(k));
}

Con este enfoque, si el documento ya está en la cache, simplemente se devuelve. Si no, se carga desde el sistema remoto y se añade a la cache.

  • Contar frecuencias de palabras: Otro uso común es cuando necesitas contar la frecuencia de palabras en un texto. Aquí puedes usar computeIfAbsent para inicializar el contador de cada palabra:
Map<String, Integer> contadorPalabras = new HashMap<>();

for (String palabra : texto.split(" ")) {
contadorPalabras.computeIfAbsent(palabra, k -> 0);
contadorPalabras.put(palabra, contadorPalabras.get(palabra) + 1);
}

Para este caso tenemos que si una palabra no está en el mapa, se inicializa con el valor 0 y luego se incrementa su contador.

Si estás buscando opciones para aprender programación, no tienes que buscar más, en Keepcoding tenemos el mejor bootcamp para ti. Se trata del curso en java que hemos preparado para que domines las mejores prácticas de programación y puedas transformar tu futuro profesional. ¡No pierdas esta gran oportunidad y únete ahora a la mejor comunidad!

Ramón Maldonado

Full Stack Developer y Responsable de Formación base en KeepCoding.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Java y Spring Boot

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado