2015-04-27 25 views
5

Ho un Map<String, List<Object>> multiFieldMap e ho bisogno di itereate sopra impostare il suo valore e aggiungere il valore al di sotto multiFieldsList comeJava 8: espressioni lambda Mappa

public List<Object> fetchMultiFieldsList() { 
    List<Object> multiFieldsList = new ArrayList<Object>(); 
    for (Entry<String, List<Object>> entry : multiFieldMap.entrySet()) { 
     String entityName = entry.getKey(); 
     List<Object> ids = entry.getValue(); 
     for (Object id : ids) { 
      Object entity = queryService.query(entityName, queryService.property("id").eq(id)); 
      multiFieldsList.add(entity); 
     } 
    } 
    return multiFieldsList; 
} 

chiedo questo metodo può essere ulteriormente semplificata?

risposta

5

È possibile utilizzare l'API Streams:

List<Object> multiFieldsList = 
    multiFieldMap.entrySet() 
       .stream() 
       .flatMap(e -> e.getValue() 
           .stream() 
           .map(o -> queryService.query(e.getKey(), queryService.property("id").eq(o)))) 
       .collect(Collectors.toList()); 
+2

Questo è in genere un caso in cui personalmente penso che una soluzione a flusso completo sia effettivamente meno leggibile di un ciclo "forew old": p – fge

2

È possibile utilizzare uno stream per semplificare il ciclo interno.

È possibile sostituire:

List<Object> ids = entry.getValue(); 
for (Object id : ids) { 
    Object entity = queryService.query(entityName, queryService.property("id").eq(id)); 
    multiFieldsList.add(entity); 
} 

con:

entry.getValue().map(
    id -> queryService.query(entityName, queryService.property("id").eq(id)) 
).forEach(multiFieldsList::add); 

Ma non si ha realmente guadagnare molto da questo. La tua scelta ...

Vedere la risposta di Eran per una soluzione "flusso completo".

+1

La semplificazione del codice non richiede sempre 'St ream' API use ... – Holger

2

è possibile semplificare in questo modo:

public List<Object> fetchMultiFieldsList() { 
    List<Object> multiFieldsList = new ArrayList<>(); 
    multiFieldMap.forEach((entityName, ids) -> 
     ids.forEach(id -> multiFieldsList.add(
      queryService.query(entityName, queryService.property("id").eq(id))) 
     ) 
    ); 
    return multiFieldsList; 
} 

meno che non si desidera utilizzare il Stream API, il metodo Map.forEach potrebbe essere la vittoria più grande per quanto riguarda semplificazione del codice in quanto non è necessario gestire Map.Entry e la sua firma generica più ...

Problemi correlati