java.time
List<Long> epochSeconds = List.of(0L, 3L, 10L, 50L, 65L, 100L);
Map<Instant, Long> countByMinute = epochSeconds.stream()
.map(Instant::ofEpochSecond)
.collect(Collectors.groupingBy(inst -> inst.truncatedTo(ChronoUnit.MINUTES), Collectors.counting()));
System.out.println(countByMinute);
Вывод:
{1970-01-01T00: 00: 00Z = 4, 1970-01-01T00: 01: 00Z =2}
Я полагаю, что вы не хотите использовать класс Date
.Он плохо спроектирован и давно устарел.Вместо этого я использую java.time, современный Java-интерфейс даты и времени.С ним гораздо приятнее работать, и я считаю, что код понятнее для чтения.Если вам нужно посмотреть на карте, используя Date
, который вы получаете от устаревшего API, который вы не можете изменить прямо сейчас, выполните преобразование в поиске.Например:
System.out.println("Count for new Date(60_000) is: "
+ countByMinute.get(new Date(60_000).toInstant()));
Счет для новой даты (60_000): 2
Если вы настаиваете, то, конечно, можно хранить Date
объектовв качестве ключей карты (повторяю, не рекомендуется):
Map<Date, Long> countByMinute = epochSeconds.stream()
.map(Instant::ofEpochSecond)
.collect(Collectors.groupingBy(inst -> Date.from(inst.truncatedTo(ChronoUnit.MINUTES)), Collectors.counting()));
System.out.println(countByMinute);
Вывод на мой компьютер в часовом поясе Европы / Копенгагена:
{Чт 01 января 01:01:00 CET1970 = 2, четверг, 01 января 01:00:00 CET 1970 = 4}
Ссылка: Учебное пособие по Oracle: дата и время , объясняющее, как использовать Java.time