ハイグエン:
以下のよう:オブジェクトを持っている私はMongoDBのIでのコレクションの間のデータの正規化のための検証機能を書いています:
class ReleaseTime{
private Date startDate;
private Date endDate;
private List<String> regions;
}
私は、同じ持っているすべてのReleaseTimeオブジェクトを収集する必要がありstartDate
、同じことがendDate
、その後一緒に地域のリストをマージ
私はたstartDateによって以下のコードが、それだけでグループを試してみました
expectedAvailabilities = ungrouppedReleaseTime.stream()
.collect(Collectors.toMap(ReleaseTime::getStartDate,
Function.identity(),
(ReleaseTime tb1, ReleaseTime tb2) ->
{
tb1.getRegions().addAll(tb2.getRegions());
tb2.getRegions().clear();
return tb1;
})
).values();
ご協力いただきありがとうございます!
フェデリコ・ペラルタシャフナー:
ここでストリームを使用せずに、あなたが望むものを行うための別の方法です:
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
挿入順序で要素を維持します。
EDIT:
あなたが必要な場合はReleaseTime
、オブジェクトの代わりに、唯一の彼らの領域を、1つの余分なステップでそれを実現できます。
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;
}