Java 拡張for文
通常のfor文では初期化式や条件式、変化式を記述しないといけませんが、ある変数の要素を最初から最後までループさせるとわかっている場合、拡張for文を使うと簡単に記述することができます。
1. 拡張for文の特徴
- 記述量が少ないため、可読性が高い
- 配列やコレクションなど、複数の要素を順番に取り出す繰り返し処理に適している
2. 書き方
for (変数の型 変数名 : 配列名 または コレクション名) {
// 変数を使った処理の内容
}
配列やコレクションの要素すべてを順番に取り出し、変数に代入して繰り返し処理をする、という場合の書き方です。
以下に具体例を示します。
3. 具体例
1~10までの数字(値)をすべて足していくと、合計値は55となります。
その処理を配列と通常のfor文、拡張for文を使って書いてみます。
public class EnhancedForLoop {
public static void main(String[] args) {
int[] numbers = new int[10];
int sum = 0;
// 配列変数:numbersに1から10までの値を連番で格納する
for (int i = 0; i < 10; i++) {
numbers[i] = i + 1;
}
// 【拡張for文】
// 配列「numbers」の各要素を先頭から順番に1つずつ変数「number」に代入し、ループ処理を行う
for (int number : numbers) {
// 変数「number」の値を変数「sum」に加算し、合計を計算する
sum += number;
}
System.out.println("配列変数:numbersの要素の値をすべて足すと" + sum + "となります。");
}
}
配列変数:numbersの要素の値をすべて足すと55となります。
4. 解説
ひとつひとつ見ていきましょう。
int[] numbers = new int[10];
int sum = 0;
要素数が 10
の int
型配列変数 numbers
を宣言し、合計値を入れておくための int
型変数 sum
を宣言します。
// 配列変数:numbersに1から10までの値を連番で格納する
for (int i = 0; i < 10; i++) {
numbers[i] = i + 1;
}
通常のfor文の書き方ですね。
配列の添え字は 0
から始まるので、初期化式は int i = 0
とし、10回繰り返すため、条件式は i < 10
です。
また、配列に格納する数字(値)は 1
から始まるため、 numbers[i] = i + 1
としています。
次は、いよいよ拡張for文の箇所です。
// 【拡張for文】
// 配列「numbers」の各要素を先頭から順番に1つずつ変数「number」に代入し、ループ処理を行う
for (int number : numbers) {
// 変数「number」の値を変数「sum」に加算し、合計を計算する
sum += number;
}
何が起きているか順を追って解説します。
【1ループ目】
- int型配列変数
numbers
の0
番目の値(numbers[0] = 1
)を int型変数number
に代入します - この時点で、まず
number = 1
となります - これを合計値を求めるための int型変数
sum
に加算代入します(sum = 1
) - これで拡張for文の中の処理(1ループ目)が終わりましたので、 int型配列変数
numbers
の次の要素に移ります
【2ループ目】
-
numbers
の1
番目の値(numbers[1] = 2
)をnumber
に代入します - ここで
number = 2
となります - そして、先ほどと同じように
sum
に加算代入します。合計値sum
の値は1 + 2 = 3
となります - 2ループ目の処理が終わり、続けて、
numbers
の次の要素に移ります
【3ループ目】
~以降、繰り返し~
以上を、拡張for文で書いた int型配列変数 numbers
の要素数すべて終わるまで繰り返します。
配列変数:numbersの要素の値をすべて足すと55となります。
5. 通常のfor文に置き換えると
上記、拡張for文の処理を、通常のfor文に置き換えると以下のようになります。
for (int i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
拡張for文のほうが圧倒的に記述量が少なく、可読性も高いように思います。
ですが、必ずしも拡張for文のほうが優れているというわけでもないので、
結局はコードを書く人、読む人、プロジェクトの方針次第なところもあるかと思われます。
例えば、通常のfor文の書き方ですと、変数 sum
に加算代入されているのが配列変数 numbers
の [i]
番目の値だな、と一目瞭然です。
条件式も i < numbers.length
なので、配列変数 numbers
の要素数分ループさせるのだな、とループ回数がわかりやすいです。
また、新しい変数名(拡張for文で使用した int number
)が登場しない点も良いところでしょう。
6. 注意点
通常のfor文と違い、拡張for文はループカウンタを使用しないので、特定のループ回数のときのみ違う処理をさせる、といったことができません。
for (int i = 0; i < numbers.length; i++) {
// 処理Aの内容
// 6ループ目のときのみ、以下条件分岐に入るようにする
if (i == 5) {
// 処理Bの内容
}
}
このように、処理Aをさせたあと、ループカウンタ i
が 5
と等しいときのみ、処理Bをさせる…というような場合です。
このケースでは通常のfor文を使いましょう。
拡張for文は最初から最後まで、同じ処理を行いたいときに使います。
ただし、配列やコレクションの要素を使用した条件で、上記のような処理を行うこともできます。
7. おわりに
配列やコレクションなど、要素が複数個ある変数の要素数分ループさせる必要があり、またすべての要素の値を使う処理(合計値を計算させる、名前をすべて出力する、etc...)を書く場合に、拡張for文を使って実装できると、コードがすっきりして良いのではないでしょうか。
コーディング規約やプロジェクトの方針、レビューアなどと、相談しながら検討してみてください。