【Salesforce/Apex】Apexで使用できる演算子まとめ

Salesforce
この記事は約13分で読めます。

SalesforceのApexで使用できる演算子を調べてまとめました。

他言語との違いや便利な演算子のサンプルも紹介します。

スポンサーリンク

Apexで使用できる演算子一覧

演算子構文説明
=x = y代入演算子 (右結合)。
y の値を L 値 x に割り当てます。
x のデータ型は y のデータ型と一致する必要があり、null となることはできません。
+=x += y加算代入演算子 (右結合)。
y の値を x の元の値に追加し、x に新しい値を再代入します。
詳細は、+ を参照してください。x および y を null にすることはできません。
*=x *= y乗算代入演算子 (右結合)。
y の値と x の元の値を乗算し、x に新しい値を再代入します。
メモx および y は Integer または Double、または組み合わせである必要があります。
x および y を null とすることはできません。
-=x -= y減算代入演算子 (右結合)。
y の値を x の元の値から減算し、x に新しい値を再代入します。
メモx および y は Integer または Double、または組み合わせである必要があります。
x および y を null とすることはできません。
/=x /= y除算代入演算子 (右結合)。
x 元の値を y の値で除算し、x に新しい値を再代入します。
メモx および y は Integer または Double、または組み合わせである必要があります。
x および y を null とすることはできません。
|=x |= yOR 代入演算子 (右結合)。
x が Boolean、かつ y が Boolean でいずれも false である場合、x は false のままとなります。
そうでない場合、x には true の値が代入されます。
x および y を null にすることはできません。
&=x &= yAND 代入演算子 (右結合)。
x が Boolean、かつ y が Boolean でいずれも true である場合、x は true のままとなります。
そうでない場合、x には false の値が代入されます。
x および y を null にすることはできません。
<<=x <<= yビット単位の左シフト代入演算子
x の各ビットを y ビット分左にシフトします。
上位の順位のビットが失われ、新しい右側のビットが 0 に設定されます。
この値は x に再代入されます。
>>=x >>= yビット単位の右シフト符号付き代入演算子
x の各ビットを y ビット分右にシフトします。
下位の順位のビットが失われ、新しい左のビットが、
y が正の値の場合は 0 に、y が負の値の場合は 1 に設定されます。
この値は x に再代入されます。
>>>=x >>>= yビット単位の右シフト符号なし代入演算子
x の各ビットを y ビット分右にシフトします。
下位の順位のビットが失われ、y のすべての値で、新しい左側のビットが 0 に設定されます。
この値は x に再代入されます。
? :x ? y : z3 項演算子 (右結合)。
この演算子は、if-then-else ステートメントの短縮として機能します。
x が Boolean で true の場合、y が結果となります。そうでない場合、z が結果となります。
メモx を null にすることはできません。
&&x && yAND 論理演算子 (左結合)。
x が Boolean、かつ y が Boolean でいずれも true である場合、式の評価は true になります。
そうでない場合、式の評価は false になります。

注意:
&& は || より優先されます。
この演算子は短絡的に動作します。つまり、y は、x が true の場合にのみ評価されます。
x および y を null とすることはできません。
||x || yOR 論理演算子 (左結合)。
x が Boolean、かつ y が Boolean でいずれも false である場合、式の評価は false になります。
そうでない場合、式の評価は true になります。

注意:
&& は || より優先されます。
この演算子は短絡的に動作します。つまり、y は、x が false の場合にのみ評価されます。
x および y を null とすることはできません。
==x == y等価演算子
x の値が y の値に等しい場合、式の評価は true になります。

そうでない場合、式の評価は false になります。
===x === y厳密な等価演算子
x および y がメモリ内のまったく同じ場所を参照する場合、式の評価は true になります。
そうでない場合、式の評価は false になります。
<x < y小なり演算子
x が y より小さい場合、式の評価は true になります。
そうでない場合、式の評価は false になります。
>x > y大なり演算子
x が y より大きい場合、式の評価は true になります。
そうでない場合、式の評価は false になります。
<=x <= y<= 演算子
x が y より小さいか等しい場合、式の評価は true になります。
そうでない場合、式の評価は false になります。
>=x >= y>= 演算子
x が y より大きいか等しい場合、式の評価は true になります。
そうでない場合、式の評価は false になります。
!=x != y不等価演算子
x の値が y の値と等しくない場合、式の評価は true になります。
そうでない場合、式の評価は false になります。
!==x !== y厳密な不等価演算子
x および y がメモリ内のまったく同じ場所を参照しない場合、式の評価は true になります。
そうでない場合、式の評価は false になります。
+x + y加算演算子
次のルールに従って、x の値を y の値に加算します。
x および y が Integer または Double の場合、この演算子は x の値を y の値に加算します。
Double が使用される場合、結果は Double となります。
・x が Date で y が Integer の場合、指定した日数を増分した新しい Date を返します。
・x が Datetime で y が Integer または Double の場合、
指定した日数を増分した新しい Date を返します。
小数点以下の値は 1 日未満の部分に相当します。
x が String で y が String またはその他のデータ型の null 以外の引数である場合、
y を x の末尾に連結します。
x – y減算演算子
次のルールに従って、x の値から y の値を減算します。
x および y が Integer または Double の場合、この演算子は y の値を x の値から減算します。
Double が使用される場合、結果は Double となります。
x が Date で y が Integer の場合、指定した日数を減分した新しい Date を返します。
x が Datetime で y が Integer または Double の場合、
指定した日数を減分した新しい Date を返します。
小数点以下の値は 1 日未満の部分に相当します。
*x * y乗算演算子
Integer または Double の x と、Integer または Double の y を乗算します。
double が使用される場合、結果は Double となります。
/x / y除算演算子
Integer または Double の x を、Integer または Double の y で除算します。
double が使用される場合、結果は Double となります。
!!x論理補数演算子
Boolean の値を反転し、true は false に、false を true にします。
-x単項否定演算子
Integer または Double の x を -1 で乗算します。
正の等価 + も構文的に有効ですが、数学的効果はありません。
++x++++xインクリメント演算子
1 を数値型の変数 x の値に加算します。
プレフィックスとして付けた場合 (++x)、式の評価は増分後の x の値になります。
ポストフィックスとして付けた場合 (x++)、式の評価は増分前の x の値になります。
x—-xデクリメント演算子
1 を数値型の変数 x の値から減算します。
プレフィックスとして付けた場合 (–x)、式の評価は減分後の x の値になります。
ポストフィックスとして付けた場合 (x–)、式の評価は減分前の x の値になります。
&x & yビット単位の AND 演算子
x の各ビットと y の対応するビットを AND 演算します。
両方のビットが 1 に設定されると結果ビットは 1 に設定されます。
|x | yビット単位の OR 演算子
x の各ビットと y の対応するビットを OR 演算します。
少なくとも 1 つのビットが 1 に設定されると結果ビットは 1 に設定されます。
^x ^ yビット単位の排他的 OR 演算子
x の各ビットと y の対応するビットを排他的 OR 演算します。
1 つのみのビットが 1 に設定され、他のビットが 0 に設定されると、
結果ビットは 1 に設定されます。
^=x ^= yビット単位の排他的 OR 演算子
x の各ビットと y の対応するビットを排他的 OR 演算します。
1 つのみのビットが 1 に設定され、他のビットが 0 に設定されると、
結果ビットは 1 に設定されます。
排他的 OR 演算の結果を x に割り当てます。
<<x << yビット単位の左シフト演算子
x の各ビットを y ビット分左にシフトします。
上位の順位のビットが失われ、新しい右側のビットが 0 に設定されます。
>>x >> yビット単位の右シフト符号付き演算子
x の各ビットを y ビット分右にシフトします。
下位の順位のビットが失われ、新しい左のビットが、
y が正の値の場合は 0 に、y が負の値の場合は 1 に設定されます。
>>>x >>> yビット単位の右シフト符号なし演算子
x の各ビットを y ビット分右にシフトします。
下位の順位のビットが失われ、y のすべての値で、新しい左側のビットが 0 に設定されます。
~~xビット単位の NOT 演算子または補数演算子
x の各 2 進数字を切り替えて、0 を 1 に、1 を 0 に変換します。
Boolean 値は True から False に、およびその逆に変換されます。
()(x)小括弧
式 x の優先順位を評価します。複合式で第一優先として評価します。
?.x?.y安全なナビゲーション演算子
null 値を操作しようとする式を除外し、
NullPointerException を発生させずに null を返します。
チェーン式の左側が null に評価される場合、チェーン式の右側は評価されません。
出典:式の演算子
スポンサーリンク

他言語との「==」「!=」の違い

Apexでは、文字列の比較で大文字と小文字を区別しません。

system.assert('a' == 'A');

ロケールで結果も変わります。

//日本ロケールで実行
system.assert('a' == 'A');

//英語ロケールで実行
system.assert('a' != 'A');
スポンサーリンク

他言語との「===」「!==」の違い

メモリ内の同じ場所かを比較します。

他の言語でよくある同じ型かの比較ではなく、文字列型はサポートしていません。

Account a = null;
Account b = null;
a = b = new Account();
system.assert(a === b);

system.assert(new Account() !== new Account());

変数aとbには同じインスタンスが代入されているので、「===」で比較してもpassします。

new Account() と new Account() は一見同じように見えるかもしれませんが、それぞれインスタンス化した後にメモリ上に格納される場所が違うため「===」で比較すると失敗します。

スポンサーリンク

3項演算子のサンプル

3項演算子は便利なため、覚えておくと良いです。

1文に何回も使うと読みにくくなるので、一旦変数に入れたり関数化する工夫をしましょう。チームで開発する場合は特に開発規約に1文に何回までと盛り込むと難解なソースコードを回避しやすいです。

String phone = string.isNotBlank(acc.PersonHomePhone) ? acc.PersonHomePhone : acc.PersonMobilePhone;

自宅電話に値がなければ携帯番号を変数に代入するなどif-then-elseを省略できます。

スポンサーリンク

安全なナビゲーション演算子のサンプル

Nullだった場合、右辺を除外しNullPointerException を発生させずに null を返します。なのでNullチェックが不要になります。毎回if文でNullチェックしてヌルポと闘うのは面倒なので、この安全なナビゲーション演算子はすごく便利です。

String name = [SELECT Name FROM Account Where Name LIKE '%X%' LIMIT 1]?.Name;

あえて言わせてもらうなら「null 合体演算子 ??」欲しいです。安全なナビゲーション演算子じゃif文内で使いにくい。

スポンサーリンク

まとめ

3項演算子や安全なナビゲーションは覚えるとコードを短く書けるため便利です。

他言語と違う特徴をもつ演算子もあるので、違いを知ることで面白いかもしれません。

この記事を書いた人
サイト運営者
Ryu
Ryu

フリーランスエンジニア。転職含め9社経験。第二新卒から未経験でIT就職。社内SEとSIerのSEで働き、企画〜運用保守、フロント〜バック・インフラとフルスタックな守備範囲。C#とSQLとSalesforceが得意。

Ryuをフォローする
Salesforce
スポンサーリンク