2015-04-27 12 views
5

Ich habe ein Map<String, List<Object>> multiFieldMap und ich muss itereate über seinen Wert den Wert auf multiFieldsList wie untenJava 8: Karte Lambda Ausdruck

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; 
} 

Am fragen, kann dieses Verfahren noch weiter vereinfacht werden gesetzt und hinzufügen?

Antwort

5

Sie die Streams API verwenden können:

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

Dies ist in der Regel ein Fall, in dem ich persönlich denke, dass eine Full-Stream-Lösung tatsächlich weniger lesbar ist als eine "gute alte" foreach-Schleife: p – fge

2

Sie können tatsächlich einen Stream verwenden, um Ihre innere Schleife zu vereinfachen.

können Sie ersetzen:

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

mit:

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

Aber Sie gewinnen nicht wirklich viel, dass aus. Ihre Wahl ...

Siehe @ Erans Antwort für eine "Full-Stream" -Lösung.

+1

Code-Vereinfachung braucht nicht immer 'St ream' API verwenden ... – Holger

2

Sie können es wie folgt vereinfachen:

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; 
} 

Sofern Sie die Stream API verwenden möchten, die Methode Map.forEach könnte der größte Gewinn sein in Bezug auf Code-Vereinfachung, da Sie nicht mit Map.Entry und seine generische Signatur mehr zu tun haben müssen ...