2015-04-27 4 views
5

У меня есть Map<String, List<Object>> multiFieldMap и мне нужно itereate над установить его значение и добавьте значение multiFieldsList нижеJava 8: Карта Lambda выражение

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 интересно может этот метод еще более упростить?

ответ

5

Вы можете использовать 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

Это, как правило, случай, когда я лично считаю, что решение с полным потоком на самом деле менее читаемо, чем «старый добрый» цикл foreach: p – fge

2

Вы действительно можете использовать поток, чтобы упростить вам внутренний цикл.

Вы можете заменить:

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

с:

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

Но вы на самом деле не получить много от этого. Ваш выбор ...

См. Ответ @ Eran для решения «полного потока».

+1

Упрощение кода не всегда необходимо 'St ream' API ... – Holger

2

Вы можете упростить это так:

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

Если вы не хотите использовать Stream API, метод Map.forEach может быть большой выигрыш в отношении упрощение кода, поскольку вам больше не нужно иметь дело с Map.Entry и его общей подписью ...

Смежные вопросы