Java 8 Streams - суммирование нескольких значений в типе из потока - PullRequest
4 голосов
/ 14 мая 2019

Я пытаюсь суммировать сумму двух переменных в классе, которые передаются из коллекции.Рассмотрим следующий простой класс.

class Widget {
    String colour;
    Double legs;
    Double arms;
    // ...
}

Я хочу передать коллекцию виджетов в потоковом режиме, сгруппировать их по цветам и вычислить сумму (ноги + руки), чтобы найти общее количество конечностей для каждого цвета.

Я хочу сделать что-то простое, как это -

widgets.stream().collect(groupingBy(Widget::getColour, summingDouble(legs + arms)));

Однако, нет функции Collectors, которая позволяла бы мне задавать пользовательское значение для суммирования.

Мой вопрос: мне нужно написать собственный коллектор или есть другой простой способ добиться того, чего я хочу?

Ответы [ 2 ]

3 голосов
/ 14 мая 2019

Вы можете просто использовать Collectors.summingDouble():

Map<String, Double> result = widgets.stream()
        .collect(Collectors.groupingBy(
                Widget::getColour,
                Collectors.summingDouble(w -> w.getArms() + w.getLegs())
        ));

Вы можете просто использовать функцию w -> w.getArms() + w.getLegs() для суммирования рук и ног.

3 голосов
/ 14 мая 2019

В качестве альтернативы вы можете использовать toMap здесь как:

Map<String, Double> colorToLimbsCount = widgets.stream()
        .collect(Collectors.toMap(Widget::getColour,
                widget -> widget.getArms() + widget.getLegs(), Double::sum));

в представлении groupingBy, это может выглядеть следующим образом:

Map<String, Double> colorToLimbsCount = widgets.stream()
        .collect(Collectors.groupingBy(Widget::getColour,
                Collectors.reducing((double) 0,
                        widget -> widget.getArms() + widget.getLegs(), Double::sum)));
...