Группировать и вычислять среднее значение массива объектов, используя поток в Java - PullRequest
0 голосов
/ 31 мая 2018

У меня есть массив объектов PricingSamples:

public class PricingSample {
    private Date time;
    private Double average;

    public PricingSample(Date time, Double average) {
        this.time = time;
        this.average = average;
    }

    public Date getTime() {
        return time;
    }

    public void setTime(Date time) {
        this.time = time;
    }

    public Double getAverage() {
        return average;
    }

    public void setAverage(Double average) {
        this.average = average;
    }
}

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

Вот что я получил.

Суммирование всех средних значений за каждый день (я группирую по подстроке свойства Date, чтобы оно группировалось по дням, т.е. четверг 26 апреля):

 Map<String, Double> counts = Arrays.stream(samples).collect(Collectors.groupingBy((PricingSample e) -> {
            return e.getTime().toString().substring(0, 10);
        },
            Collectors.summingDouble((PricingSample e) -> {
                return e.getAverage();
            })));

Получение количества образцов за каждый день: Счетчик карт =

Arrays.stream(samples).collect(Collectors.groupingBy((PricingSample e) -> {
            return e.getTime().toString().substring(0, 10);
        },
                Collectors.counting()
            ));

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Попробуйте,

final Map<Date, Double> averageByDate = pricingSamples.stream().collect(
        Collectors.groupingBy(PricingSample::getTime, Collectors.averagingDouble(PricingSample::getAverage)));

В случае, если вы используете массив, измените его следующим образом:

final Map<Date, Double> averageByDate = Stream.of(pricingSamples).collect(
                Collectors.groupingBy(PricingSample::getTime, Collectors.averagingDouble(PricingSample::getAverage)));
0 голосов
/ 31 мая 2018

Если вы хотите получить среднее значение, используйте averagingDouble.Таким образом, вам не нужно вычислять сумму и количество выборок.

Map<String, Double> averages = 
    Arrays.stream(samples)
          .collect(Collectors.groupingBy(e -> e.getTime().toString().substring(0, 10),
                                         Collectors.averagingDouble(PricingSample::getAverage)));

Если вы хотите отсортировать Map по его ключам (дням), вы можете заставить вывод бытьa TreeMap:

Map<String, Double> averages = 
    Arrays.stream(samples)
          .collect(Collectors.groupingBy(e -> e.getTime().toString().substring(0, 10),
                                         TreeMap::new,
                                         Collectors.averagingDouble(PricingSample::getAverage)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...