Сопоставить поток Java с картой объектов с объектом в качестве ключа
У меня есть несколько классов, и я делаю некоторую работу в List
public Stream<Map<WorkDay, Set<LedgerItem>>> adjustWorkDays(List<WorkDay> workDays) {
return workDays.stream()
.sorted((d1,d2) -> d1.getCreated().compareTo(d2.getCreated()))
.map(day -> createGroupByWorkDay(day))/*need it to collect here*/;
}
Если вы видите, возвращаемый тип Stream<Map<WorkDay, Set<LedgerItem>>>
но я хочу отобразить это из потока как Map<WorkDay, Set<LedgerItem>>
с коллекционером, но просто не могу получить Collectors.toMap()
Синтаксис сделать что-нибудь, кроме перерыва.
Как я уже сказал, все работает отлично, поэтому мне не нужно ничего, кроме картографирования, чтобы работать.
Просто к вашему сведению: createGroupByWorkDay
возвращается Map<WorkDay, Set<LedgerItem>>
уже, но принимает только один WorkDay
так как это требование, поэтому я не могу изменить способ, которым это выполняется...
заранее спасибо
РЕДАКТИРОВАТЬ: Итак, метод, который у меня есть createGroupByWorkDay
то, что здесь не указано, работает как положено и никогда не изменится. Возвращает правильный тип Map<WorkDay, Set<LedgerItem>>
но имеет подпись только для одного рабочего дня, как это createGroupByWorkDay(WorkDay day)
к рассматриваемому методу в исходном комментарии он используется для построения отдельных карт, которые сгруппированы по WorkDay и возвращаются, но их может быть N, поэтому метод public Stream<Map<WorkDay, Set<LedgerItem>>> adjustWorkDays(List<WorkDay> workDays)
должен вернуть все эти Карты, собранные в одну карту в коллекторе. Если это имеет какой-то смысл?
1 ответ
Ваш вопрос мне не понятен. Но я думаю, что вы, возможно, просите что-то подобное?
Map<WorkDay, List<LedgerItem>> result = workDays.stream()
.collect(Collectors.toMap(Function.identity(), WorkDay::getLedgerItems));
Если нет, пожалуйста, объясните вашу проблему ясно. Это всего лишь предположение.
Вот обновление,
Map<WorkDay, List<LedgerItem>> result = workDays.stream()
.map(d -> createGroupByWorkDay(d))
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));