2015-04-27 32 views
5

Tôi có một Map<String, List<Object>> multiFieldMap và tôi cần phải itereate trên giá trị của nó thiết lập và thêm giá trị cho multiFieldsList như sauJava 8: Bản đồ Lambda biểu

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 tự hỏi phương pháp này có thể được đơn giản hóa hơn nữa?

Trả lời

5

Bạn có thể sử dụng API Luồng:

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

Đây thường là trường hợp cá nhân tôi nghĩ rằng một giải pháp luồng đầy đủ thực sự ít có thể đọc được hơn vòng lặp foreach "cũ" tốt: p – fge

2

Bạn thực sự có thể sử dụng luồng để đơn giản hóa vòng lặp bên trong.

Bạn có thể thay thế:

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

với:

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

Nhưng bạn không thực sự đạt được nhiều từ đó. Lựa chọn của bạn ...

Xem câu trả lời của @ Eran cho giải pháp "toàn luồng".

+1

Việc đơn giản hóa mã không phải lúc nào cũng cần 'St sử dụng API ream'… – Holger

2

Bạn có thể đơn giản hóa nó như thế này:

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

Trừ khi bạn muốn sử dụng Stream API, phương pháp Map.forEach có thể là chiến thắng lớn nhất liên quan đến đơn giản hóa mã khi bạn không cần phải xử lý Map.Entry và chữ ký chung của nó nữa…

Các vấn đề liên quan