2015-04-27 10 views
5

Bir Map<String, List<Object>> multiFieldMap var ve değeri ayarlamak üzerinde itereate ve Am bu yöntem daha da basitleştirilmiş olabilir merak Java 8: Harita Lambda ifade

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

aşağıdaki gibi multiFieldsList değer katmak gerekir?

cevap

5

Sen Akışları API kullanabilirsiniz Eğer Stream API kullanmak istemiyorsanız

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

, yöntem Map.forEach ilgili büyük bir kazanç olabilir Map.Entry ve onun genel imzası ile uğraşmanıza gerek kalmadan kod sadeleştirmesi artık…

+2

Bu, tipik olarak tam akış çözümünün aslında “eski iyi” foreach döngüsünden daha az okunabileceğini düşündüğüm bir durumdur: p – fge

2

Gerçekten iç döngüyü basitleştirmek için bir akış kullanabilirsiniz.

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

ile:

Sen yerini alabilir

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

Ama gerçekten o fazla yarar yoktur. Seçiminiz ...

@ @ Eran'ın bir "tam akış" çözümü için yanıtını görün.

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()); 
+1

Kod sadeleştirme her zaman gerekli değildir. ream' API kullanımı… – Holger

2

Böyle bunu kolaylaştırabilirsiniz: