【Java入門】for-each文の書き方、breakやcontinueも解説します

投稿日: 作成:   更新:

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文を使うと良いでしょう。