El método Map.computeIfAbsent ()

1. Información general

En este tutorial, veremos brevemente el nuevo método predeterminado computeIfAbsent de la interfaz Map introducido en Java 8.

Específicamente, veremos su firma, uso y cómo maneja diferentes casos.

2. Método Map.computeIfAbsent

Comencemos mirando la firma de computeIfAbsent :

default V computeIfAbsent(K key, Function mappingFunction)

El método computeIfAbsent toma dos parámetros. El primer parámetro es la clave y el segundo parámetro es la función de mapeo. Es importante saber que la función de mapeo solo se llama si el mapeo no está presente.

2.1. Clave relacionada con un valor no nulo

En primer lugar, comprueba si la clave está presente en el mapa. Si la clave está presente y un valor no nulo está relacionado con la clave, devuelve ese valor:

Map stringLength = new HashMap(); stringLength.put("John", 5); assertEquals((long)stringLength.computeIfAbsent("John", s -> s.length()), 5);

Como vemos, la clave "John" tiene un mapeo no nulo presente, devuelve el valor 5. Si se utilizara nuestra función de mapeo, esperaríamos que la función devuelva la longitud de 4.

2.2. Usar la función de mapeo para calcular el valor

Además, si la clave no está presente en el mapa o el valor nulo está relacionado con la clave, intenta calcular el valor utilizando la función de mapeo dada . Además, ingresa el valor calculado en el mapa a menos que el valor calculado sea nulo.

Echemos un vistazo al uso de mappingFunction en el método computeIfAbsent :

Map stringLength = new HashMap(); assertEquals((long)stringLength.computeIfAbsent("John", s -> s.length()), 4); assertEquals((long)stringLength.get("John"), 4);

Dado que la clave "John" no está presente, calcula el valor pasando la clave como parámetro a la función de mapeo .

2.3. La función de mapeo devuelve nulo

Además, si mappingFunction devuelve nulo , el mapa no registra ningún mapeo:

Map stringLength = new HashMap(); assertEquals(stringLength.computeIfAbsent("John", s -> null), null); assertNull(stringLength.get("John"));

2.4. La función de mapeo arroja una excepción

Finalmente, si mappingFunction arroja una excepción no verificada, entonces la excepción se vuelve a lanzar y el mapa no registra ningún mapeo:

@Test(expected = RuntimeException.class) public void whenMappingFunctionThrowsException_thenExceptionIsRethrown() { Map stringLength = new HashMap(); stringLength.computeIfAbsent("John", s -> { throw new RuntimeException(); }); }

Vemos que mappingFunction arroja una RuntimeException , que se propaga de nuevo al método computeIfAbsent .

3. Conclusión

En este artículo rápido, analizamos el método computeIfAbsent , su firma y su uso. Finalmente, vimos cómo maneja diferentes casos.

Como siempre, todos estos ejemplos de código están disponibles en GitHub.