2015-11-05 2 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; 
} 

Как написать этот фрагмент кода с использованием Java8 с использованием лямбда-выражений?

+3

Почему вы используете итераторы и циклы 'while'? Улучшенный цикл 'for' делает это намного проще и работает со времен Java 5, и вы, очевидно, на Java 5, поскольку используете дженерики. – Andreas

+1

Это похоже на много кода, чтобы ожидать, что кто-то здесь перепишет для вас. У вас есть какая-то конкретная проблема? Если это так, вы должны сосредоточить внимание на этой проблеме. – Brick

ответ

6

Я бы не использовать какие-либо лямбды для этого, но я использовал 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)); 
Смежные вопросы