Winter21でリリースされた安全なナビゲーション演算子。
これまでせこせことぬるぽさんに打ち勝つためにNullチェックを入れていましたが、
これでもっと単調なコードが書けるかも!と
心躍らせながら、試してみました。
Contents
これまでのコードを確認
さてではこれまでのコードを確認してみましょう。
下記のような例を書いてみました。
Map<Id,Account> accMap = new Map<Id,Account>([SELECT Id,Name FROM Account WHERE Id = '0016F00002V0iSUQAZ']);
Id key = '0016F00002V0rEaQAJ';
system.debug(accMap.get(key).Name);
これを実行してみると、

こんなのが出ますね。当然です。
一応解説すると、Mapの方にはないキーが指定されたので取得できないので
Nullが返ってきたためNullで落ちます。
それを今までは下記のようにしていたかと思います。
Map<Id,Account> accMap = new Map<Id,Account>([SELECT Id,Name FROM Account WHERE Id = '0016F00002V0iSUQAZ']);
Id key = '0016F00002V0rEaQAJ';
if (accMap.get(key) != null) {
system.debug(accMap.get(key).Name);
}
nullじゃないか確認してと、
まあやりたい事によってコードは変わると思いますがざっくりこんな感じの事をする必要がありました。
Apexの新時代だ!
では先程のコードを安全なナビゲーション演算子を使って書き換えてみます。
Map<Id,Account> accMap = new Map<Id,Account>([SELECT Id,Name FROM Account WHERE Id = '0016F00002V0iSUQAZ']);
Id key = '0016F00002V0rEaQAJ';
system.debug(accMap.get(key)?.Name);
ん?どこが変わったの?
となるかもですが、
accMap.get(key)?.Name
?.演算子が着いた点にご注目です。
この演算子により先程エラーが発生したコードが通るようになります。

しかも結果はちゃんとNullで返されます。
if文で余計な分岐をしていたところがかなり単調にできる可能性がありますね。
?.演算子はいわゆる三項演算子と同じようなものなので使いすぎると結果、
読みにくくなる可能性があるかもなので、わかりやすい使い方を心がけるべきかとも思いました。
ちなみに三項演算子と考えた時に当然なんですが、下記のような使い方はできないみたいです。
system.debug([SELECT Id,Name FROM Account WHERE Name = 'アンダーソン']?.);
まあ、当然ですね。
サンプル
例えば下記のような引数のIdを元にAccountを取得してNameを返すメソッドがあった場合にも?.演算子で書き換えることができます。
変更前
public static String getAccountName(Id accId){
List<Account> accList = [SELECT Id,Name FROM Account WHERE Id = :accId];
if ( !accList.isEmpty() ) {
return null;
}
return accList[0].Name;
}
変更後
public static String getAccountName(Id accId){
return [SELECT Id,Name FROM Account WHERE Id = :accId]?.Name;
}
だいぶスッキリ書くことができますね!
今まで書いたコード全て見直したい気分にかられています笑
これからも綺麗なコードを書けるように精進あるのみですね!