Javaのfor-each文について解説します。
PHPなどの他のプログラミング言語では、forはインデックス番号、foreachは配列のコレクションとはっきりと分かれているのですが、
Javaの場合はどちらもfor文です。
同じ「for文」だと説明がややこしいので、
この記事では「for-each文」と呼ばせていただきます。
Java8から「forEach」のラムダ式メソッドが使用できますが、
このことについては一切触れませんので、よろしくお願いします。
- Javaのfor-each文の書き方が知りたい。
- for-each文で配列のindexやkeyの取得方法は?
- for-each文はどんな時に使う?
このような内容について解説します。
私はWEB開発中心に、フロントエンド、サーバーサイド、サーバー構築など経験豊富なエンジニアです。
これからプログラミングを始める方に向けて、少しでも分かりやすく解説していきたいと思います。
まずはforeach文の処理イメージだけでも覚えていただければと思います。
それでは行きましょう!
目次
for-each文の書き方
配列をループする場合
ArrayListのfor-each文をソースコードで書いてみます。
list から取得した値を1つずつvalue にセットして、println() で出力しています。
ArrayList<String> list = new ArrayList<String>(Arrays.asList("バナナ", "イチゴ", "すいか")); for (String value : list) { System.out.println(value); }
実行結果:

配列の値がすべて表示できました。
連想配列をループする場合
Javaで連想配列はHashMapクラスを使用します。
keyをループさせて「キー:値」で表示しています。
HashMap<String, String> map = new HashMap<String, String>() { { put("banana", "バナナ"); put("strawberry", "イチゴ"); put("watermelon", "すいか"); } }; for (String key : map.keySet()) { System.out.println(key + ":" + map.get(key)); }
実行結果:

配列のキーと値が表示されました。
break(抜け出す)
foreach文を途中で抜け出すには、「break;」を使用します。
先ほどの「連想配列をループする場合」のソースコードで、
if文のとき「strawberry」になったら抜け出すように変更してみます。
HashMap<String, String> map = new HashMap<String, String>() { { put("banana", "バナナ"); put("strawberry", "イチゴ"); put("watermelon", "すいか"); } }; for (String key : map.keySet()) { // キーが「strawberry」の時にループを抜け出す if (key.equals("strawberry")) { break; } System.out.println(key + ":" + map.get(key)); }
実行結果:

「strawberry」でループを抜け出しましたので、「banana」だけが表示されました。
continue(スキップ)
for-each文の途中でスキップするときは、continueを使用します。
if文で「strawberry」のときだけスキップしてみます。
HashMap<String, String> map = new HashMap<String, String>() { { put("banana", "バナナ"); put("strawberry", "イチゴ"); put("watermelon", "すいか"); } }; for (String key : map.keySet()) { // キーが「strawberry」の時はスキップする if (key.equals("strawberry")) { continue; } System.out.println(key + ":" + map.get(key)); }
実行結果:

「strawberry」だけスキップされて、「banana、watermelon」が表示されました。
for-each文はどんな時に使うのか
for-each文はデータベースから取得した連想配列を扱うのによく使いますので、データベースから取得した配列のイメージから説明します。
データベースから取得した配列のイメージ
今回はJavaからMySQLへの接続方法については説明しませんが、データベースに次のデータが入っているとします。(以下の画像はphpMyAdminで表示した)

このデータをSpring bootの「JdbcTemplate」などで取得すると、
ListとMapが一緒になったデータ「List<Map<String, Object>>」の形で取得できます。
次のソースコードは、MySQLから取得したデータを再現してみました。
// データベースからJdbcTemplateを使ってデータ取得したと仮定する List<Map<String, Object>> results = new ArrayList<Map<String,Object>>(); results.add(new HashMap<String, Object>() {{ put("no", 1); put("name", "バナナ"); put("color", "黄色"); }}); results.add(new HashMap<String, Object>() {{ put("no", 2); put("name", "イチゴ"); put("color", "赤"); }}); results.add(new HashMap<String, Object>() {{ put("no", 3); put("name", "すいか"); put("color", "緑"); }});
配列のループ
早速、取得したデータをfor-each文でループしてみます。
results から1行ずつ取り出して、row.get(“no”)のように指定して出力しています。
List<Map<String, Object>> results = new ArrayList<Map<String,Object>>(); results.add(new HashMap<String, Object>() {{ put("no", 1); put("name", "バナナ"); put("color", "黄色"); }}); results.add(new HashMap<String, Object>() {{ put("no", 2); put("name", "イチゴ"); put("color", "赤"); }}); results.add(new HashMap<String, Object>() {{ put("no", 3); put("name", "すいか"); put("color", "緑"); }}); // results から1行ずつMapを取り出して出力 for (Map<String, Object> row : results) { System.out.print(row.get("no") + "、"); System.out.print(row.get("name") + "、"); System.out.println(row.get("color")); }
実行結果:

データ配列の中身を表示できました。
このようにデータベースから持ってきた配列をfor-each文で表示するのは結構使いますので覚えておきましょう。
まとめ
いかがだったでしょうか。
Javaのfor-each文について次の内容で解説しました。
- for-each文の書き方(配列のループ、連想配列のループ、breakで抜け出し、continueでスキップ)
- for-each文はどんな時に使うのか(データベースの配列イメージ、配列のループ)
for-each文を使うとソースコードが読みやすくなりますので、for文とfor-each文のどちらも利用できる状況であればfor-each文を使うと良いでしょう。