Salesforceのfor文について知っておくべきこと【セールスフォース】


こんにちは、アンダーソンです。
今回はプログラミングやってる人なら当然のように使ったことがある
for文についてSalesforce特有の動きをご紹介していきます。

従来のforループ

一般的なfor文の使い方として

List<Account> accList = [SELECT Id FROM Account LIMIT 100];
for ( Integer i = 0 ; i < accList.size() ; i++ ) {
    Contact c = new Contact(
        FirstName = 'Test' + i,
        AccountId = accList[i].Id
    ); 
}

for ( 初期化 ; 継続条件 ; 再初期化 )
という見慣れた形でのfor文がApexにもあります。

リスト反復またはセット反復の For ループ

Apexでは配列やセット内の要素の反復をさせることができます。

List<String> sList = new List<String>{'apple','orange','banana'};
for ( String s : sList ) {
    system.debug(s);
}

これを実行した結果がこちらです。

簡単に反復をとることができるためわかりやすいですね。
今回はStringでしたが、受け取る側はsObjectやObject型でもOKです。

SOQL for ループ

リスト反復はSalesforce特有だと思いますがこちらもSalesforce特有のループ処理になると思います。

Integer i = 0;
for ( Account acc : [SELECT Id FROM Account LIMIT 100] ) {
    Contact c = new Contact(
        FirstName = 'Test' + i,
        AccountId = acc.Id
    );
    i++;
}

先ほどのリストの部分にSOQLを実行して帰ってきた配列をそのまま反復させる形です。

実行速度比較

それぞれにLimits.getCpuTime()をつけてみたのと開発者コンソールでTimeLineをみて確認してみました。

下記が結果です。※全てAccount100件を取得してcontactのAccountIdに紐付けを行ってます。

①従来のforループ CpuTime:8 HeapSize:4847

②リスト反復またはセット反復の For ループ CpuTime:9 HeapSize:4853

③SOQL for ループ CpuTime:11 HeapSize:1192

という結果になりました。明らかに③のヒープサイズが下がっているのがわかると思います。
処理が多くなるような場合には基本的には③の処理を使うのがいいかと思います。

この違いはしっかり頭に入れた上で実装していかないとダメですね。