2 回答

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊
這是在不使用流的情況下執(zhí)行您想要的操作的另一種方法:
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()));
這用于按開始日期和結(jié)束日期對(duì)對(duì)象Map.computeIfAbsent區(qū)域進(jìn)行分組ReleaseTime。
如果分組ReleaseTime對(duì)象之間存在重復(fù)區(qū)域并且您不希望重復(fù),則可以使用 aSet而不是 a 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()));
請(qǐng)注意,我使用LinkedHashMap和LinkedHashSet來保持元素的插入順序。
編輯:
如果您需要ReleaseTime對(duì)象而不僅僅是其區(qū)域,則可以通過一個(gè)額外步驟來實(shí)現(xiàn):
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))));
這假設(shè)有一個(gè)ReleaseTime接收所有屬性的構(gòu)造函數(shù):
public ReleaseTime(Date startDate, Date endDate, List<String> regions) {
this.startDate = startDate;
this.endDate = endDate;
this.regions = regions;
}

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超4個(gè)贊
您可以將分組用作:
// Collection<ReleaseTime> ungrouppedAvailabilites...
Collection<ReleaseTime> mergedRegionsCollection = ungrouppedAvailabilites.stream()
.collect(Collectors.toMap(t -> Arrays.asList(t.getStartDate(), t.getEndDate()),
Function.identity(), ReleaseTime::mergeRegions))
.values();
其中mergeRegions實(shí)現(xiàn)為:
ReleaseTime mergeRegions(ReleaseTime that) {
List<String> mergedRegions = this.getRegions();
mergedRegions.addAll(that.getRegions());
return new ReleaseTime(this.startDate, this.endDate, mergedRegions);
}
注意:為了避免改變現(xiàn)有對(duì)象,您可以使用以下實(shí)現(xiàn):
ReleaseTime mergeRegions(ReleaseTime that) {
return new ReleaseTime(this.startDate, this.endDate,
Stream.concat(this.getRegions().stream(), that.getRegions().stream())
.collect(Collectors.toList()));
}
添加回答
舉報(bào)