はじめに
こんにちは。今年の春に某ユーザー系企業に入社した新人エンジニアです。
OJTとしてSpring Bootを用いたJavaでのwebアプリ開発をしています。
そこで同期の様子を伺っていると、型やデータの受け渡しといったプリミティブな部分、特にList<Map<String, Object>>の扱いで躓いているようでした。
この記事では上述のような方を対象に、新人エンジニアの言葉でList<Map<String, Object>の概念を説明しています。
1.「型」について
List<Map<String, Object>>に入る前に「型」についておさらいをしておきます。
JavaにはStringやIntegerといった「型」が存在します。
(基本データ型とクラス型の違いといった部分は本筋から逸れるので棚上げしちゃいましょう)
この「型」とは何か?
ざっくり表現すると**「格納されるデータの形を決めるもの」です。
Stringであれば「文字列が格納されるもの」、Integerであれば「整数値が格納されるもの」となります。
以降の記事はどのような形のデータが格納されるのか**を意識して読み進めて下さい。
2.Map<String, Object>
唐突ですが、あなたに3つ質問があります。
- あなたの「性別」を教えて下さい
- あなたの「身長」を教えて下さい
- あなたの「体重」を教えて下さい
...なるほど、なるほど。
「性別」は「男性」で、「身長」は「171cm」で、「体重」は「62kg」ですね。
勘の良い方は既にお気づきかと思われます。
Map<String, Object>はこのような**「1対1対応の関係が格納されるもの」**です。
格納される情報の数に制限はありません。上記に加えて「スリーサイズ」を格納しても大丈夫。
上記の場合、Map<String, Object>型の変数mapExampleの中身には、
「{性別="男性", 身長=171, 体重=61, スリーサイズ=**}」といった値が格納されています。
「性別」「身長」「体重」「スリーサイズ」はString型で、
「"男性"」「171」「61」「**」はObject型(すべての型が入ることが許される)であるため、
Map<String, Object>と記述されているのです。
3.List<String>
またまた唐突ですが、私には今すぐ食べたいものがいくつかあります。
リストにすると以下の通りです。
食べたいものリスト
- うなぎ
- アイスクリーム
- 杏仁豆腐
Javaでこのリストを記述したいときにList<String>を使います。
List<String>はこのような**「値の羅列が格納されるもの」**です。
上記の場合、List<String>型の変数listExampleの中身には、
「["うなぎ", "アイスクリーム", "杏仁豆腐"]」といった値が格納されています。
「うなぎ」「アイスクリーム」「杏仁豆腐」はすべてString型であるため、
List<**String**>と記述されています。
4.List<Map<String, Object>>
これまでを踏まえて、List<Map<String, Object>>を眺めてみて下さい。
すると、Map<String, Object>がList<>の中に入っているという構造が見えるようになっているはずです。
Map<String, Object>型の変数を3つ用意します。
mapExample1:「{性別="男性", 身長=171, 体重=61, スリーサイズ=**}」
mapExample2:「{性別="女性", 身長=160, 体重=50, スリーサイズ=**}」
mapExample3:「{性別="不明", 身長=123, 体重=123, スリーサイズ=**}」
List<Map<String, Object>>型の変数listExampleにこれらの値を格納すると、
「[{性別="男性", 身長=171, 体重=61, スリーサイズ=**}, {性別="女性", 身長=160, 体重=50, スリーサイズ=**}, {性別="不明", 身長=123, 体重=123, スリーサイズ=**}]」といった値となります。
5.おわりに
List<Map<String, Object>>の概念は以上の通りです。
そしてJavaの面白い所はここからです。
Javaの型にはメソッドというものが用意されています。
例えば、上記のlistExampleの中のmapExample2の身長を取り出したいなんてときは、
「listExample.get(1).体重」と記述するとバッチリ返ってきます。
このように様々な操作を実行することができます。
以下のリファレンスを見ながら自分なりの使い方を見つけてみてください。
Java公式リファレンス
Overview (Java Platform SE 8 )