JavaストリームAPIは初めてです。2つのリストがあり、両方の内部オブジェクトIDが一致する場合は、いくつかの属性をMAPに追加する必要があります。以下は実装です。
List<LookupMstEntity> examTypeDetails; //This list contains values init.
List<MarksMstEntity> marksDetailList; //This list contains values init.
//FYI above entities have lombok setter, getter, equals & hashcode.
Map<Long, Integer> marksDetailMap = new HashMap<>();
//need below implementation to changed using Java 8.
for (LookupMstEntity examType : examTypeDetails) {
for (MarksMstEntity marks : marksDetailList) {
if (examType.getLookupId() == marks.getExamTypeId())
marksDetailMap.put(examType.getLookupId(), marks.getMarks());
}
}
観察:
最初に、結果のマップは、IDタイプに一致できるのは1つだけであることを示しています(そうでない場合、重複キーがあり、値はList
ではなく、Integer
または重複キーをマージする他の方法である必要があります。そのため、最初のものをマップに挿入し、内側のループから抜け出します。
for (LookupMstEntity examType : examTypeDetails) {
for (MarksMstEntity marks : marksDetailList) {
if (examType.getLookupId() == marks.getExamTypeId()) {
marksDetailMap.put(examType.getLookupId(),
marks.getMarks());
// no need to keep on searching for this ID
break;
}
}
}
また、2つのクラスが、id
にアクセスできる親クラスまたは共有インターフェースによって関連付けられており、2つのクラスがそのequal
に基づいてid
と見なされている場合も、同様のことができます。
for (LookupMstEntity examType : examTypeDetails) {
int index = marksDetailList.indexOf(examType);
if (index > 0) {
marksDetailMap.put(examType.getLookupId(),
marksDetaiList.get(index).getMarks());
}
}
もちろん、インデックスを見つけるための負担はまだありますが、現在は内部にあり、その責任から解放されます。
HashMap
を使用してO(N)
時間の複雑さでそれを行うことができます。最初に、IDをキーとして2つのリストをMap<Integer, LookupMstEntity>
とMap<Integer, MarksMstEntity>
に変換します
Map<Integer, LookupMstEntity> examTypes = examTypeDetails.stream()
.collect(Collectors.toMap(LookupMstEntity::getLookupId,
Function.identity()) //make sure you don't have any duplicate LookupMstEntity objects with same id
Map<Integer, MarksMstEntity> marks = marksDetailList.stream()
.collect(Collectors.toMap(MarksMstEntity::getExamTypeId,
Function.identity()) // make sure there are no duplicates
次に、examTypes
マップをストリーミングし、MarksMstEntity
マップに同じIDのmarks
が存在する場合はマップに収集します
Map<Integer, Integer> result = examTypes.entrySet()
.stream()
.map(entry->new AbstractMap.SimpleEntry<Integer, MarksMstEntity>(entry.getKey(), marks.get(entry.getKey())))
.filter(entry->entry.getValue()!=null)
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));