8
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

こんにちは、アンダーソンです。
今回はプログラミングやってる人なら当然のように使ったことがある
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

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

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

8
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?