2015-12-01 8 views
8

ho una mappa:In stile funzionale Java8, come posso mappare i valori già esistenti coppia chiave-valore

Map<String, List<Object>> dataMap; 

Ora voglio aggiungere nuove coppie di valori chiave per la mappa come di seguito:

if(dataMap.contains(key)) { 
    List<Object> list = dataMap.get(key); 
    list.add(someNewObject); 
    dataMap.put(key, list); 
} else { 
    List<Object> list = new ArrayList(); 
    list.add(someNewObject) 
    dataMap.put(key, list); 
} 

Come posso farlo con lo stile funzionale Java8?

risposta

10

È possibile utilizzare computeIfAbsent.

Se la mappatura non è presente, è sufficiente crearne una associando la chiave con una nuova lista vuota e quindi aggiungere il valore in essa.

dataMap.computeIfAbsent(key, k -> new ArrayList<>()).add(someNewObject); 

Come afferma documentazione, restituisce il valore corrente (esistente o calcolata) associata con la chiave specificata in modo da poter concatenare la chiamata con ArrayList#add. Ovviamente questo presuppone che i valori nella mappa originale non siano elenchi di dimensioni fisse (non so come lo hai riempito) ...

A proposito, se si ha accesso all'origine dati originale, I prenderebbe il flusso da esso e utilizzare Collectors.groupingBy direttamente.

0

Questo può essere semplificato utilizzando l'operatore ternario. Non si ha realmente bisogno l'istruzione if-else

List<Object> list = dataMap.containsKey(key) ? dataMap.get(key) : new ArrayList<>(); 
list.add(someNewObject); 
dataMap.put(key, list); 
Problemi correlati