Вот альтернативный способ делать то, что вы хотите, без использования потоков:
Map<List<Date>, List<String>> map = new LinkedHashMap<>();
ungrouppedAvailabilites.forEach(a ->
map.computeIfAbsent(Arrays.asList(a.getStartDate(), a.getEndDate()), // or List.of
k -> new ArrayList<>())
.addAll(a.getRegions()));
Используется Map.computeIfAbsent
для группировки областей ReleaseTime
объектов по датам начала и окончания.
Если среди сгруппированных ReleaseTime
объектов есть повторяющиеся области и вам не нужны дубликаты, вы можете использовать Set
вместо List
:
Map<List<Date>, Set<String>> map = new LinkedHashMap<>();
ungrouppedAvailabilites.forEach(a ->
map.computeIfAbsent(Arrays.asList(a.getStartDate(), a.getEndDate()), // or List.of
k -> new LinkedHashSet<>())
.addAll(a.getRegions()));
Обратите внимание, что я использую LinkedHashMap
и LinkedHashSet
, чтобы сохранить элементы в порядке вставки.
РЕДАКТИРОВАТЬ:
Если вам нужно ReleaseTime
объектоввместо только их регионов вы можете достичь этого с помощью одного дополнительного шага:
Map<List<Date>, ReleaseTime> result = new LinkedHashMap<>();
map.forEach((k, v) ->
result.put(k, new ReleaseTime(k.get(0), k.get(1), new ArrayList<>(v))));
Предполагается, что есть конструктор для ReleaseTime
, который получает все атрибуты:
public ReleaseTime(Date startDate, Date endDate, List<String> regions) {
this.startDate = startDate;
this.endDate = endDate;
this.regions = regions;
}