Суммируйте значения из Карт с помощью потоков и собирайте в Список - PullRequest
4 голосов
/ 10 июля 2019

Если у меня есть список списков:

List<List<Map<String, Object>>> myList = new ArrayList<>();

List<Map<String, Object>> e1 = new ArrayList<>();
e1.add(new HashMap<String, Object>(){{put("test", 1);}});
e1.add(new HashMap<String, Object>(){{put("test", 6);}});

List<Map<String, Object>> e2 = new ArrayList<>();
e2.add(new HashMap<String, Object>(){{put("test", 9);}});
e2.add(new HashMap<String, Object>(){{put("test", 2);}});

myList.add(e1);
myList.add(e2);

Я хочу иметь возможность перебирать myList суммировать числа во внутренних списках (e1 и e2) и возвращать списокиз сумм:

List<Integer> result = [7, 11]

Ответы [ 2 ]

4 голосов
/ 10 июля 2019

Вы можете сделать это:

List<Integer> result = myList.stream()
        .map(list -> list.stream()
                        .flatMapToInt(map -> map.values()
                                                .stream()
                                                .mapToInt(i -> (int) i))
                        .sum())
        .collect(Collectors.toList());
0 голосов
/ 10 июля 2019

Вот еще одна альтернатива, более глобальная. ernest_k решение лучше и элегантнее, но, возможно, это поможет вам узнать больше о потоках

    BinaryOperator<Object> accumulator = (a, b) -> Double.parseDouble("" + a) + Double.parseDouble("" + b);

    List sums = myList.stream().map((e) -> e.stream()
            .map((content) -> content.values().stream().reduce(0, accumulator)).reduce(0, accumulator))
            .collect(Collectors.toList());
    System.out.println("sums \n"+sums);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...