for (String str : strs) { // 各要素を扱う処理 System.out.println(str); }
解説) for文の「:」の右側には、配列またはコレクションを置くことができ、左側には各要素の型と変数名とを宣言します。
この式で、配列またはコレクションのすべての要素に対して、順に処理が行われます。また、各要素のクラスは、for文のカッコの中(「(String str : strs)」)ですでに宣言されているので、以降の明示的なキャストが必要なくなります。
これまでは、配列やコレクションの各要素を取り扱うには、以下のようにコードを記述しました。
String[] strs = new String[3]; strs[0] = "eins"; strs[1] = "zwei"; strs[2] = "drei"; for (int i = 0; i < strs.length; i++) { // 各要素を扱う処理 System.out.println(strs[i]); }
Collection strs = new ArrayList(); strs.add("eins"); strs.add("zwei"); strs.add("drei"); for (Iterator it = strs.iterator(); it.hasNext(); ) { String str = (String) it.next(); // 各要素を扱う処理 System.out.println(str); }
このように、for文の度にインデックスや反復子(iterator)を宣言しなければなりませんでした。そのため、for文が入れ子になっているような複雑な操作をする場合には、見通しが悪くバグの温床になりがちでした。
また、コレクションの場合には、リストの赤字部分に示すように各要素を取り出す際にクラスキャストが必要でした。これは単に1行追加しなくてはならないというだけでなく、誤ったクラスキャストをコードに忍び込ませてしまう原因になるものでした。クラスキャストの誤りはコンパイル時には検証できないものなので、検出しにくいバグを生み出す温床となります。