Хобрук: Ваш путь к мастерству в программировании

Как я могу использовать лямбда-метод summaryStatistics() для поиска статистики значений LocalTime?

У меня есть список карт с простыми объектами Runner.class:

List<Map<String, Runner>> times

, Например:

{
   "pedro": [
      { lap=1, time=00:01:16.11 },
      { lap=2, time=00:00:42.45 },
      { lap=3, time=00:00:58.23 }
   ],
   "huan": [
      { lap=1, time=00:00:48.33 },
      { lap=2, time=00:00:41.21 }
   ]
   "gomez": [
      { lap=1, time=00:01:02.42 },
      { lap=2, time=00:01:12.31 },
      { lap=3, time=00:01:58.14 },
      { lap=3, time=00:00:55.41 }
   ]
}

Вот мой класс бегунов:

public class Runner {

   private Integer lap;
   private LocalTime time;
   // Getters and setters...
}

Мне нужно получить карту статистики, как это делает лямбда summaryStatistics(), с минимальным, максимальным и средним временем для каждого бегуна, которая выглядит так:

Map<String, DoubleSummaryStatistics> statsMap

, поэтому я мог бы повторить его и использовать методы getMin(), getAverage() и getMax()... Но я понятия не имею, как работать с LocalTime?


  • пользовательский коллектор — это то, что вам нужно; но вычисление среднего для двух LocalTimes будет забавным 12.11.2019
  • Map<String<DoubleSummaryStatistics>> не имеет смысла. Возможно, вы имеете в виду Map<String,DoubleSummaryStatistics>? Один из подходов состоит в том, чтобы сопоставить LocalTime со значением long, собрать статистику и преобразовать минимальные/максимальные/средние значения обратно в LocalTime. В качестве альтернативы вы можете создать свою собственную статистику и реализацию сборщика, аналогичную этой, только для LocalTime вместо BigDecimal. 12.11.2019
  • Да, спасибо, это была опечатка... Результат определенно должен быть Map‹String, DoubleSummaryStatistics› 12.11.2019
  • Тип ввода вашего примера (с учетом JSON) и тот, который определен в Java, также противоречат друг другу, тип ввода объекта должен быть Map<String, List<Runner>> times вместо List<Map<String, Runner>> times 13.11.2019
  • @Holger Вы имели в виду значение double вместо long в своем комментарии? и имеет ли смысл использовать toSecondOfDay или toNanoOfDay при попытке получить итоговые значения позже? 13.11.2019
  • @Naman зависит от точки зрения. Классы времени поддерживают только преобразования в int или long, в зависимости от поля. Но, конечно, вы можете повысить результат до double, даже неявно, чтобы получить DoubleSummaryStatistics, если этого желает OP. Я рассматривал long, потому что преобразование значений результата обратно во время выглядело для меня естественным. 13.11.2019

Ответы:


1

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

public Map<String, DoubleSummaryStatistics> createStats(Map<String, List<Runner>> times) {
    return times.entrySet().stream()
          .collect(Collectors.toMap(Map.Entry::getKey,
                  e ->e.getValue().stream()
                          .map(Runner::getTime)
                          .mapToDouble(LocalTime::toSecondOfDay) // inverse while extrating summary details
                          .summaryStatistics()));
}
13.11.2019
  • или e ->e.getValue().stream() .collect(Collectors.summarizingDouble(r -> r.getTime() .toSecondOfDay()), или используйте один .mapToDouble(r -> r.getTime() .toSecondOfDay()) 13.11.2019
  • Когда я писал код, я думал о сингле @Holger map. Я просто хотел выделить toSecondOfday и что для получения сводных значений необходимо применить обратный подход. Спасибо за ответ и summarizingDouble напоминание. 13.11.2019
  • Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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