Developer

Apexで使える知ってると便利な小技【Apex】

Developer
この記事は約5分で読めます。

スポンサーリンク

Listのサイズをあらかじめ決める

Apexで間違いなく一番よく使うであろうList。配列としての宣言の仕方をすると、
Listのサイズを決めることができます。

String[] sampleList = new String[10];
system.debug(sampleList);
system.debug(sampleList.size());
スクリーンショット 2019-09-10 20.20.31.png

何も入れていない状態なのでNullが10個入りました。
Stringではなく、他の型、例えば Integerとかでも同じようにNullが入った状態で初期化されます。

さらに指定した箇所に対して値を代入することももちろんできます。

sampleList[0] = '朝起きる';
sampleList[5] = '歯を磨く';
sampleList[9] = '家を出る';
スクリーンショット 2019-09-10 20.27.07.png

ちゃんと指定した箇所に代入されてますね。
うまく使えばリスト並び順を指定したリストを作るのに役立ちそうです。

DateTimeで曜日を取得する

Date型では曜日を取ることはできないんですが、DateTime型では曜日を取得することができます。

DateTime sampleDate = datetime.newInstance(2019, 09, 10);
system.debug(sampleDate.format('EEE'));
system.debug(sampleDate.format('EEEEE'));
スクリーンショット 2019-09-10 20.32.14.png

format()の中に’EEE’もしくは’EEEEE’を入力します。
‘EEE’は略称の曜日が’EEEEE’では正式な形で出力されます。

public String getDayOfWeek(DateTime targetDate){
     String checkDayOfWeek = targetDate.format('EEE');

     if (checkDayOfWeek == 'Mon') {
         retrun '月';
     } else if (checkDayOfWeek == 'Tue') {
         retrun '火';
     } else if
         ・
         ・
         ・

こうすればVisualforceへ曜日を渡すこともできます。
ちなみにVF側では曜日を数式で取得するしかないためこの方法がやりやすいかと思います。

Mapを使って処理時間を短縮する

トリガなどでループ処理を書く際はできるだけMapやSetを使用して、
狙った値が出てくるようにするのがポイントです。

例えば

List accList = [SELECT Id FROM Account LIMIT 20];
List conList = [SELECT ID,AccountId FROM Contact LIMIT 20];
Integer i = 0;
for ( Account ac : accList ) {
    for ( Contact co : conList ) {
        if ( co.AccountId == ac.Id ) {
            i++;
        }
    }
}
system.debug(i);

このようにすると、Accountリストの中身の数×Contactリストの数になってしまいます。
そしてCPUTimeはその分増えてしまいます。


こういった場合はAccountのMapを作って、keyにIdを指定します。
そしてContactリストでループを回して、Mapの中を取得するとループ回数は減り
CPUTimeの節約につながります。

List accList = [SELECT Id FROM Account LIMIT 20];
List conList = [SELECT ID,AccountId FROM Contact LIMIT 20];
Map acMap = new Map(accList);
Integer i = 0;
    for ( Contact co : conList ) {
        if ( acMap.get(co.AccountId) != null ) {
            i++;
        }
    }
system.debug(i);

こうすれば時間は半分以下に削減することができます。
多くなればなるほどこの効果が出てくるので、大量データを扱うような現場やトリガを初めて書くような
方は是非覚えておくといいと思います。

Mapの便利な使い方

MapはId,sObjectであればリストを直接入れることができます。

Map<Id,Account> accMap = new Map<Id,Account>([SELECT Id, FROM Account]);

またvalueがsObjectであればそのままDML操作をすることもできます。
例えば先ほどのMapの値を書き換えたとします。

for ( Id key : accMap.keyset() ) {
    accMap.get(key).Phone = '080-0000-0000';
}
update accMap.values();

とこのように直接項目を書き換えることもできますし、
書き換えた値をそのままupdateすることもできます。

ちなみにSetはDML操作できないので気をつけましょう。

その他の開発に関する記事はこちらです。

Developerも含めた試験問題にチャレンジしてみましょう。

コメント