Il metodo Map.computeIfAbsent ()

1. Panoramica

In questo tutorial, vedremo brevemente al nuovo metodo di default computeIfAbsent della mappa di interfaccia introdotta in Java 8.

In particolare, esamineremo la sua firma, l'utilizzo e il modo in cui gestisce i diversi casi.

2. Metodo Map.computeIfAbsent

Cominciamo guardando la firma di computeIfAbsent :

default V computeIfAbsent(K key, Function mappingFunction)

Il metodo computeIfAbsent accetta due parametri. Il primo parametro è la chiave e il secondo parametro è mappingFunction. È importante sapere che la funzione di mappatura viene chiamata solo se la mappatura non è presente.

2.1. Chiave correlata a un valore non nullo

In primo luogo, controlla se la chiave è presente nella mappa. Se la chiave è presente e un valore non nullo è correlato alla chiave, restituisce quel valore:

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

Come si vede, la chiave “John” ha una mappatura non nulla, restituisce il valore 5. Se fosse usata la nostra funzione di mappatura, ci aspetteremmo che la funzione restituisca la lunghezza di 4.

2.2. Utilizzo della funzione di mappatura per calcolare il valore

Inoltre, se la chiave non è presente nella mappa o il valore null è correlato alla chiave, allora tenta di calcolare il valore utilizzando la mappingFunction data . Inoltre, inserisce il valore calcolato nella mappa a meno che il valore calcolato non sia nullo.

Diamo uno sguardo all'uso di mappingFunction nel metodo computeIfAbsent :

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

Poiché la chiave "John" non è presente, calcola il valore passando la chiave come parametro a mappingFunction .

2.3. Funzione di mappatura Restituisce null

Inoltre, se mappingFunction restituisce null , la mappa non registra alcuna mappatura:

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

2.4. La funzione di mappatura genera un'eccezione

Infine, se mappingFunction genera un'eccezione non selezionata, l'eccezione viene nuovamente generata e la mappa non registra alcuna mappatura:

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

Vediamo che mappingFunction genera una RuntimeException , che si propaga al metodo computeIfAbsent .

3. Conclusione

In questo breve articolo, abbiamo esaminato il metodo computeIfAbsent , la sua firma e il suo utilizzo. Infine, abbiamo visto come gestisce i diversi casi.

Come sempre, tutti questi esempi di codice sono disponibili su GitHub.