2 回答

TA贡献1826条经验 获得超6个赞
这是在不使用流的情况下执行您想要的操作的另一种方法:
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对象之间存在重复区域并且您不希望重复,则可以使用 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()));
请注意,我使用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;
}

TA贡献1829条经验 获得超4个赞
您可以将分组用作:
// Collection<ReleaseTime> ungrouppedAvailabilites...
Collection<ReleaseTime> mergedRegionsCollection = ungrouppedAvailabilites.stream()
.collect(Collectors.toMap(t -> Arrays.asList(t.getStartDate(), t.getEndDate()),
Function.identity(), ReleaseTime::mergeRegions))
.values();
其中mergeRegions实现为:
ReleaseTime mergeRegions(ReleaseTime that) {
List<String> mergedRegions = this.getRegions();
mergedRegions.addAll(that.getRegions());
return new ReleaseTime(this.startDate, this.endDate, mergedRegions);
}
注意:为了避免改变现有对象,您可以使用以下实现:
ReleaseTime mergeRegions(ReleaseTime that) {
return new ReleaseTime(this.startDate, this.endDate,
Stream.concat(this.getRegions().stream(), that.getRegions().stream())
.collect(Collectors.toList()));
}
添加回答
举报