今回は、「Mapの使い方」についてです。
Apex開発では、「List」、「Set」に並んでよく使用される「Map」ですが、自分はなかなか理解できずでした、、、
Mapを使用することでかなり効率的に開発を進めることができるので使わない手はないですね。
Mapとは
Mapとは「対応付け」のことです。
そして、ListやSetとの大きな違いとして、「key」と「value」を持ちます。
そしてそして、valueはkeyを使って取り出すことができます。
これだけ聞いても、は?って感じだと思いますので具体例を挙げて説明します。
【よくわかる具体例】
みなさんが学校に通っていたころ、出席番号というものがありましたよね。
名前の五十音順に割り当てられて、学年が変わるたびに変わるあの番号です。
出席番号は生徒1人ひとりに必ず1つ割り当てられます。番号を生徒と対応つけているのです。
この番号があることによって先生は、それぞれの生徒の出席率やテストの点数の管理が簡単にできるというわけですね。
Mapもこれと全く同じ考えです。
出席番号1番を「愛知 太郎」に割り当てると、それは出席番号というkeyに対して、愛知 太郎というvalueを対応つけることになります。
そして出席番号1番の生徒の情報を見たければ、生徒情報が格納されているデータベースで(そんなものが学校にあるのかはわかりませんが。笑)1番を検索すれば簡単に「愛知 太郎」の情報を見つけ出すことができます。
これがkey(鍵)を使ってvalue(値)を取り出すということです。
以上がMapの基本的な考え方になります。
Mapの使い方
次に、Mapの使い方を以下の3ステップで解説します。
- Mapの宣言
- 値の入れる
- 値の取り出す
1. Mapを宣言しよう
Mapの宣言方法ですが、ListやSetと同じようにデータ型を<>で囲んで宣言します。
そして、<>の中でkey、とvalueを用意する必要があります。
/**********
**Mapの宣言方法
**********/
//宣言例① String型のkeyに、String型のvalueを対応づける
Map<String, String> strMap = new Map<String, String>();
//宣言例② Id型のkeyに、Account型(オブジェクト)のvalueを対応づける
Map<Id, Account> accMap = new Map<Id, Account>();
//宣言例③ Id型のkeyに、String型のsetをvalueとして対応づける
Map<Id, Set<String>> sstMap = new Map<Id, Set<String>>();
2. Mapに値を入れよう
Mapのキーと値の設定の方法ですが、宣言方法と同様、いくつかのパターンを見てみましょう
Putを使用した方法
まずは、基本的な書き方から。
「List」や「Set」では、値を設定する際に「add」を使用しますが、Mapでは「put」を使用します。役割は同じです。
Map<Integer, String> strMap = new Map<Integer, String>();
strMap.put(1, '愛知 太郎');
strMap.put(2, '石川 健太');
strMap.put(3, '愛媛 良太');
system.debug(strMap);
strMapの中身を確認すると、

ちゃんと「key=value」の形になって対応付けされていますね!
Listを使用するやり方
続いても「put」を使用しますが、Listをfor文で回してMapに格納するパターンです。
//Accountレコードを取得
List<Account> accList = [Select Id, Name From Account Limit 3];
//Mapを宣言
Map<Id, Account> accMap = new Map<Id, Account>();
//取得したAccountレコードを1件ずつ回してMapに格納
for(Account acc : accList){
accMap.put(acc.Id, acc);
}
system.debug(accMap);
上の例では、AccountのIdをkeyにして、Accountレコード自体をvalueとして対応付けています。
accMapの中身を見てみると、

こちらも「key=value」の形になっていますね。そして、valueの中にはAccountレコードが入っていることも確認できます。
スマートに見えるやり方
上記の2つの方法をスマートにした書き方がこちらです。
Map<Integer, String> strMap = new Map<Integer, String>{
1 => '愛知 太郎', 2 => '石川 健太', 3 => '愛媛 良太'
};
//Accountのレコードを取得しMapに格納
Map<Id, Account> accMap = new Map<Id, Account>([Select Id, Name From Account]);
とてもシンプル。
もちろんMapの中身は先ほどと同じです。
3. Mapの値を取り出そう
ここでは、代表的な2つの値の取り出し方を見てみます。
get(key)を使用したやり方
Mapの最大の利点はkeyさえあれば、簡単にvalueを取り出せるということです。
その特徴を利用して以下のように値を取り出すことができます。
Map<Integer, String> strMap = new Map<Integer, String>{
1 => '愛知 太郎', 2 => '石川 健太', 3 => '愛媛 良太'
};
//keyが3に対応付けられたvalueを取得
strmap.get(3);
system.debug(strmap.get(3));
取得した結果がこちら。

keyが3のvalueを取得できていますね。
values()を使用したやり方
values()を用いると、keyなしでvalueの全値をリストにして返してくれます。
Map<Integer, String> strMap = new Map<Integer, String>{
1 => '愛知 太郎', 2 => '石川 健太', 3 => '愛媛 良太'
};
//valueをすべて取得
strmap.values();
system.debug(strmap.values());
取得した結果がこちらです。

keyに関係なくすべてのvalueが取得できました。
個人的によく使うMapの用法
個人的には、以下のようにある値に一致している値があるかどうかを調べる時によくMapを使用します。
List<Contact> conList = [Select Id, AccountId From Contact];
Map<Id, Account> accMap = new Map<Id, Account>([Select Id, Name From Account]);
//conListの中身を回していく
for(Contact con : conList){
//取得したContact.AccountIdがaccMapに含まれているかを判定
if(accMap.containsKey(con.AccountId)){
//何かしらの処理
}
}
やはり、keyを指定してあげることでvalueを引き出すことができるので、2つの値を比較する時なんかに特に力を発揮してくれている感がありますね。
Mapのメソッド
以下、Mapで使用可能なメソッドです。
それぞれの使い方は公式レファレンスをのぞいてみてください。
No | メソッド | 説明 |
---|---|---|
1 | clear() | 対応付けからすべてのキーと値の対応付けを削除する |
2 | clone() | 対応付けの重複コピーを作成する |
3 | containsKey(key) | 指定されたキーの対応付けが含まれている場合は「true」を返す |
4 | deepClone() | sObject レコード値との対応付けの場合、sObject レコードを含む、対応付けの重複コピーを作成する |
5 | equals(map2) | この対応付けと指定された対応付けを比較し、両方の対応付けが等しい場合は「true」を返し、そうでない場合は「false」を返す |
6 | get(key) | 指定したキーが対応付けられている値または、このキーの対応付けに値が含まれていない場合は「null」を返す |
7 | getSObjectType() | Map 値を構成する sObject データ型のトークンを返す |
8 | hashCode() | この対応付けに対応する hashcode を返す |
9 | isEmpty() | 対応付けのキーと値のペアが 0 の場合、true を返す |
10 | keySet() | 対応付けのすべてのキーを含むセットを返す |
11 | put(key, value) | 指定された値を対応付けの指定したキーに関連付ける |
12 | putAll(fromMap) | 指定先の対応付けからすべての対応付けを、元の対応付けにコピーする |
13 | putAll(sobjectArray) | sObject レコードのリストを、Map<ID, sObject>、または Map<String, sObject> として宣言されている対応付けに追加する |
14 | remove(key) | 指定されたキーの対応付けを対応付けから削除し、対応する値がある場合は、その値を返す |
15 | size() | 対応付けのキー-値のペアの数を返す |
16 | toString() | 地図の文字列表現を返す |
17 | values() | 対応付けのすべての値を含むリストを返す |
まとめ
今回は「Mapの使い方」について解説しました。
ポイントとしては、「key」と「value」を持ち、「key」を使って「value」取り出すことができるということでしたね。
使ってみると非常に便利!


コメント