はじめに
Apexにて、二つのオブジェクトのリストを特定のkeyを使ってマージしたいケースがあったので方法を調べました。
List<A__c> aObjects = [SELECT Key__c, X__c FROM A__c];
//
// 例えば次のリストが得られるとする
// [
// {
// Key__c: 'hhh',
// X__c: 'Dog_1'
// },
// {
// Key__c: 'jjj',
// X__c: 'Dog_2'
// }
// ]
List<B__c> bObjects = [SELECT Key__c, Y__c FROM B__c];
//
// 例えば次のリストが得られるとする
// [
// {
// Key__c: 'hhh',
// Y__c: 'Cat_1'
// },
// {
// Key__c: 'iii',
// X__c: 'Cat_2'
// }
// ]
// この時に、次のマージしたリストを得たい
List<C__c> cObjects = mergeLists(aObjects, bObjects);
//
// [
// {
// Key__c: 'hhh',
// X__c: 'Dog_1',
// Y__c: 'Cat_1'
// },
// {
// Key__c: 'iii',
// X__c: null,
// Y__c: 'Cat_2'
// },
// {
// Key__c: 'jjj',
// X__c: 'Dog_2',
// Y__c: null
// }
// ]
KeyにIdを使う場合
マージに使うKeyにId項目を使う場合はMapを活用して次のように実現できます。
Map<Id, A__c> aObjectsMap = new Map<Id, A__c>([SELECT Id, X__c FROM A__c]);
List<B__c> bObjects = [SELECT Id, Y__c FROM B__c];
List<C__c> cObjects = new List<C__c>();
for ( B__c bObject : bObjects ) {
// MapからIdが等しいA__cのレコードを得る
A__c aObject = (A__c)aObjectsMap.get(bObject.Id);
// C__cオブジェクトに設定してリストに詰める
C__c cObject = new C__c();
cObject.Key__c = aObject.Id;
cObject.X__c = aObject.X__c;
cObject.Y__c = bObject.Y__c;
cObjects.add(cObject);
}
ちなみに、最初のMapを作る処理は次のようにもできます。
List<A__c> aObjects = [SELECT X__c FROM A__c];
Map<Id, A__c> aObjectsMap = new Map<Id, A__c>(aObjects);
SOQLでIdをとっていなくても、ListからIdをKeyとするMapに変換することで自動でIdをセットしてくれます。
KeyにId以外を使う場合
マージに使うKeyにId項目以外を使う場合は最初のMapを作るまでに一工夫必要です。
List<A__c> aObjects = [SELECT Key__c, X__c FROM A__c];
Map<String, A__c> aObjectsMap = new Map<String, A__c>();
for ( A__c aObject : aObjects ) {
aObjectsMap.put(aObject.Key__c, aObject);
}
// あとはこのMapを使ってマージ処理を行う
List<B__c> bObjects = [SELECT Key__c, Y__c FROM B__c];
List<C__c> cObjects = new List<C__c>();
for ( B__c bObject : bObjects ) {
// MapからKey__cが等しいA__cのレコードを得る
A__c aObject = (A__c)aObjectsMap.get(bObject.Key__c);
// C__cオブジェクトに設定してリストに詰める
C__c cObject = new C__c();
cObject.Key__c = aObject.Key__c;
cObject.X__c = aObject.X__c;
cObject.Y__c = bObject.Y__c;
cObjects.add(cObject);
}
まとめ
Map型のKeyにマージに使いたいKey値を設定することで、二つのリストをマージする方法を示しました。
考え方はシンプルですので、意外と簡単だと感じられたのではないでしょうか。