【Apex】2つのMapのkeyとvalueの組合せが等しいことを確認する

Salesforce

2つのMapの対応付け(KeyとValueの組合せ)が等しいことを確認する場面が出てきたので、調査がてら書いていこうと思います。

Apex開発者ガイドを見ると、equals(map2)メソッドで対応付けが等しいかの確認ができるとのこと。
Apex 開発者ガイド Map クラス

まずは別インスタンスですが、KeyとValueの組合せが全く同じ2つのMapの比較をしてみます。

結果は2つのMapは同じと判定されました。まあ、ここまでは良いでしょう。

USER_DEBUG [16]|DEBUG|map1とmap2は同じ

続いて、Mapにputする順番を変えて比較してみます。

こちらも同じものと判定されました。

USER_DEBUG [16]|DEBUG|map1とmap2は同じ

ちなみにkeyとvalueの組合せが違う場合や、keyの数が違う場合には ちゃんとequals=falseの結果となりました。

・・・という感じで、今回私がやりたかったことの調査は終わったのですが、Mapといえばよく使うのがkeyがId、valueがsObject型の組合せだと思いますので、ついでにそちらも調査してみました。

まずはSOQLで取得したAccountリストを別インスタンスのMapにそれぞれツッコんでみて、equalsで比較してみます。

結果は同じMapと認識されました。まずは想定通りです。

USER_DEBUG [18]|DEBUG|map1とmap2は同じ

では別インスタンスのAccountリストをツッコんだ場合はどうなるでしょう。
Mapの組合せ的には同じでも、equalsはfalseになると思うのですが・・

お~、結果は同じMapと判定されました。予想外。

USER_DEBUG [20]|DEBUG|map1とmap2は同じ

これは、sObjectの中身をちゃんと見てequalsかどうかを比較しているということですかね。
試しに上記コードのmap2の方、少し値を変えてみようと思います。

結果は異なるMapと認識されました。やはりsObjectの中身もちゃんと見て比較しているようですね。
Javaのクラス型だと、中身が同じでも別インスタンスだと別物の扱いとなった記憶があるので、その感覚で考えていました(Javaも最近触っていないので、薄~い記憶ですが・・)。

いずれにしても、Mapクラスのequalsはけっこう使いみちがあるかも!?です。

コメント

タイトルとURLをコピーしました