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

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

<!-- wp:heading -->
<h2>従来のforループ</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>一般的なfor文の使い方として</p>
<!-- /wp:paragraph -->

<!-- wp:code {"className":"java"} -->
<pre class="wp-block-code java"><code>List&lt;Account> accList = [SELECT Id FROM Account LIMIT 100];
for ( Integer i = 0 ; i &lt; accList.size() ; i++ ) {
    Contact c = new Contact(
        FirstName = 'Test' + i,
        AccountId = accList[i].Id
    ); 
}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>for ( 初期化 ; 継続条件 ; 再初期化 )<br>という見慣れた形でのfor文がApexにもあります。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>リスト反復またはセット反復の For ループ</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Apexでは配列やセット内の要素の反復をさせることができます。</p>
<!-- /wp:paragraph -->

<!-- wp:code {"className":"java"} -->
<pre class="wp-block-code java"><code>List&lt;String> sList = new List&lt;String>{'apple','orange','banana'};
for ( String s : sList ) {
    system.debug(s);
}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>これを実行した結果がこちらです。</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":1655,"width":550,"height":80,"sizeSlug":"large"} -->
<figure class="wp-block-image size-large is-resized"><img src="https://keneloper.com/wp-content/uploads/2020/02/スクリーンショット-2020-02-27-22.33.46.png" alt="" class="wp-image-1655" width="550" height="80"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>簡単に反復をとることができるためわかりやすいですね。<br>今回はStringでしたが、受け取る側はsObjectやObject型でもOKです。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>SOQL&nbsp;for&nbsp;ループ</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>リスト反復はSalesforce特有だと思いますがこちらもSalesforce特有のループ処理になると思います。</p>
<!-- /wp:paragraph -->

<!-- wp:code {"className":"java"} -->
<pre class="wp-block-code java"><code>Integer i = 0;
for ( Account acc : [SELECT Id FROM Account LIMIT 100] ) {
    Contact c = new Contact(
        FirstName = 'Test' + i,
        AccountId = acc.Id
    );
    i++;
}</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>先ほどのリストの部分にSOQLを実行して帰ってきた配列をそのまま反復させる形です。</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>実行速度比較</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>それぞれにLimits.getCpuTime()をつけてみたのと開発者コンソールでTimeLineをみて確認してみました。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>下記が結果です。※全てAccount100件を取得してcontactのAccountIdに紐付けを行ってます。</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>①従来のforループ　CpuTime：8　HeapSize：4847</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":1661,"sizeSlug":"large"} -->
<figure class="wp-block-image size-large"><img src="https://keneloper.com/wp-content/uploads/2020/02/スクリーンショット-2020-02-27-22.58.50-1024x223.png" alt="" class="wp-image-1661"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>②リスト反復またはセット反復の For ループ　CpuTime：9　HeapSize：4853</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":1662,"sizeSlug":"large"} -->
<figure class="wp-block-image size-large"><img src="https://keneloper.com/wp-content/uploads/2020/02/スクリーンショット-2020-02-27-22.58.57-1024x223.png" alt="" class="wp-image-1662"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>③SOQL&nbsp;for&nbsp;ループ　CpuTime：11　HeapSize：1192</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":1663,"sizeSlug":"large"} -->
<figure class="wp-block-image size-large"><img src="https://keneloper.com/wp-content/uploads/2020/02/スクリーンショット-2020-02-27-22.59.01-1024x223.png" alt="" class="wp-image-1663"/></figure>
<!-- /wp:image -->

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

<!-- wp:paragraph -->
<p>この違いはしっかり頭に入れた上で実装していかないとダメですね。</p>
<!-- /wp:paragraph -->