拡張for文【enhanced for loop】
概要

通常のfor文は「for(初期化; 条件式; 更新式)」の形式で、カウンタ変数の初期化、終了条件、更新処理をすべて指定する必要がある。整数配列aの全要素を処理する場合、for(int i=0; i<a.length; i++) のように記述し、a[i]で現在の要素を参照する。
これに対し、拡張for文は「for(型名 変数名 : 配列名あるいはコレクション名)」という形式で記述する。例えばint型の配列 a={10,20,30} に対し、for(int n:a){...} と書くと、1回目のnには10、2回目には20、3回目には30が代入される。添字の管理や要素数の確認を記述せずに、各要素を順番に取り出して処理できる点が通常のfor文との違いである。
拡張for文はJava 5(J2SE 5.0)で導入された。配列だけでなく、Iterableインターフェースを実装したListやSetなどのコレクションにも使用できる。コレクションを対象とする場合、内部的にはイテレータを用いた走査処理にコンパイル時に変換される仕組みになっている。Java 10以降では変数宣言にvarを用い、for(var n:a)のように記述することも可能である。
拡張for文を使う利点は、コードの可読性が高まることと記述ミスを防げることにある。配列の要素数を手動で取得し境界条件を設定する必要がないため、範囲外アクセスによる実行時エラーやループ条件の指定ミスによる無限ループを避けやすい。
一方で、処理中の要素が先頭から何番目かを示す添字を直接保持・参照する仕組みはない。要素の位置情報が必要な場合は、開発者自身が別途カウンタ変数を用意して管理する必要がある。また、要素の参照を目的とした処理に適する一方、要素の値を直接書き換える処理や、逆順での走査、一つ飛ばしなど不規則な順序での参照には対応していない。
Java 8以降では、コレクションのforEachメソッドを用いてラムダ式と組み合わせ、要素ごとの処理を1行で記述する方法も加わった。単純な走査処理においては、現在も拡張for文が広く利用されている。JavaScriptなど他の言語にも、似たような構文の簡略化されたfor文が追加されている。