2015-11-05 94 views
0

我的要求,我有地圖的列表如何扁平化的地圖列表中的Java 8

[{Men=1},{Men=2, Women=3},{Women=2,Boys=4}] 

現在我需要使它成爲一個flatMap,使得它看起來像

Gender=countOfValues 

在上面例如輸出將

{Men=3,Women=5,Boys=4} 

目前,我有以下代碼:

private Map<String, Long> getGenderMap(
     List<Map<String, Long>> genderToCountList) { 
    Map<String, Long> gendersMap = new HashMap<String, Long>(); 
    Iterator<Map<String, Long>> genderToCountListIterator = genderToCountList 
      .iterator(); 
    while (genderToCountListIterator.hasNext()) { 
     Map<String, Long> genderToCount = genderToCountListIterator.next(); 
     Iterator<String> genderToCountIterator = genderToCount.keySet() 
       .iterator(); 
     while (genderToCountIterator.hasNext()) { 
      String gender = genderToCountIterator.next(); 
      if (gendersMap.containsKey(gender)) { 
       Long count = gendersMap.get(gender); 
       gendersMap.put(gender, count + genderToCount.get(gender)); 
      } else { 
       gendersMap.put(gender, genderToCount.get(gender)); 
      } 
     } 
    } 
    return gendersMap; 
} 

我們如何使用lambda表達式使用Java8編寫這段代碼?

+3

你爲什麼使用迭代器和while循環?增強的'for'循環使得它更加簡單,並且自從Java 5以來一直存在,並且自從使用泛型以來顯然在Java 5上運行。 – Andreas

+1

這看起來像很多代碼,希望有人在這裏爲你重寫。你有什麼具體問題嗎?如果是這樣,你應該關注這個問題。 – Brick

回答

6

我不會用任何lambda表達式這一點,但我已經使用Map.merge和方法參考,無論是在Java的推出8

Map<String, Long> result = new HashMap<>(); 
for (Map<String, Long> map : genderToCountList) 
    for (Map.Entry<String, Long> entry : map.entrySet()) 
     result.merge(entry.getKey(), entry.getValue(), Long::sum); 

您還可以Stream就做這樣的:

return genderToCountList.stream().flatMap(m -> m.entrySet().stream()) 
      .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, Long::sum));