Java8 HashMap внутри другого Hashmap, как найти сумму зарплаты - PullRequest
0 голосов
/ 17 июня 2019

У меня есть структура, как показано ниже. Я пытаюсь рассчитать сумму всех зарплат сотрудников. Я хотел бы использовать потоки Java. Может кто-нибудь объяснить, как мне этого добиться?

Employee имеет метод getSalary.

Map<String, Map<String, Employee>> mainMap = new HashMap<>();
Map<String, Employee> emplmap1 = new HashMap<>();
Map<String, Employee> emplmap2 = new HashMap<>();

emplmap1.put("A",empl1);
emplmap1.put("B",empl2);

Ответы [ 2 ]

3 голосов
/ 17 июня 2019

Вы хотите использовать flatMap, который может принимать элемент, который является потоком, а затем объединяет все потоки в один поток, и map, который преобразует элементы в потоке в различные элементы:

double salary = mainMap.values().stream()
        .flatMap(m -> m.values().stream())
        .map(Employee::getSalary)
        .mapToDouble(Double::doubleValue)
        .sum();

System.out.println("Total salary: " + salary);

mainMap.values().stream() вернет поток значений mainMap (карты).Мы flatMap делаем поток, превращая каждый элемент (карту) в поток значений этой карты.Затем мы получаем зарплаты, превращаем их в примитивные double s и, наконец, мы sum их.

1 голос
/ 17 июня 2019

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

DoubleSummaryStatistics salaryStats = mainMap.values().stream()
    .flatMap(m -> m.values().stream())
    .collect(Collectors.summarizingDouble(Employee::getSalary));

Таким образом вы получите сумму, количество, максимум, минимум, среднее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...