web-dev-qa-db-ja.com

類似したオブジェクトIDを持つ2つのリストからマップを取得する

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());
    }
}
4

観察:

最初に、結果のマップは、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());
    }
}

もちろん、インデックスを見つけるための負担はまだありますが、現在は内部にあり、その責任から解放されます。

0
WJS

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));
0
Deadpool