概要
要素を反復処理するためのメソッドである。
具体的には、Iterable
を実装したオブジェクト(例: リスト、セットなど)の要素を順番に取り出して、指定した処理を適用する。
forEach
メソッドは以下のようなシグネチャとなっている。
void forEach(Consumer<? super T> action)
action
パラメータは、要素に対して適用する処理を表す関数型インターフェースであるConsumer
である。
Consumer
インタフェースは、引数を受け取り、結果を戻さない関数型インタフェースである。
forEach()
メソッドは、要素を反復処理する際に、指定されたConsumer
のaccept()
メソッドを呼び出す。各要素に対して、Consumer
のaccept()
メソッドが呼び出されることで、指定した処理が実行される。
例
List<String> list = Arrays.asList("apple", "banana", "orange");
list.forEach(item -> System.out.println(item));
この例では、forEach()
メソッドを使って、list
というリストの要素を順番に取り出し、ラムダ式によって処理を行っている。ラムダ式では、各要素を受け取ってコンソールに出力している。
上記の例では、リストの要素が "apple"
、"banana"
、"orange"
の順で出力される。
forEach()
メソッドを使うことで、繰り返し処理を行うためのループを明示的に書く必要がなくなる。代わりに、シンプルなラムダ式を使用して要素を処理することができる。
引数として渡せるもの
forEach()
メソッドにはConsumer
型の関数オブジェクトである以下を引数として渡すことができる。
- ラムダ式
- メソッド参照
ラムダ式
Consumer
型の関数オブジェクトをラムダ式で表現すると、要素を受け取って処理を行うコードが短く表現することができる。
例
List<String> list = Arrays.asList("apple", "banana", "orange");
list.forEach(item -> {
// ここに処理のコードを書く
System.out.println(item);
});
上記の例では、ラムダ式がConsumer
型の関数オブジェクトとして使用されている。引数item
にはリストの要素が渡され、各要素をコンソールに出力している。
メソッド参照
Javaにおいてメソッド自体を関数オブジェクトとして扱うための短縮記法であり、コードをより簡潔にすることができる。メソッド参照を使用することで、メソッドをラムダ式に変換せずに直接参照することができる。
以下ではラムダ式と比較する。
例(ラムダ式を使用した場合)
List<String> list = Arrays.asList("apple", "banana", "orange");
list.forEach(item -> System.out.println(item));
この場合、forEach
メソッドに渡されるのは、要素を受け取ってコンソールに出力するためのラムダ式である。
例(メソッド参照を使用した場合)
List<String> list = Arrays.asList("apple", "banana", "orange");
list.forEach(System.out::println);
ここでは、System.out
というオブジェクトに対して、println
というメソッド参照を使用している。::
を使用してクラス名またはインスタンス名、その後にメソッド名を指定することで、メソッド参照を表現する。
コンソールに出力するだけであれば、ラムダ式よりもメソッド参照の方が簡易に記述できる。
ラムダ式もメソッド参照も、引数の受け渡しや戻り値の型が一致している必要がある。
forEach
メソッドの引数として渡す必要があるのはConsumer
型の関数オブジェクトであり、ラムダ式やメソッド参照を使って直接的に作成することが一般的である。
補足(イテレーションについて)
データの集合(例:リスト、配列、セットなど)の要素を順番に取り出す処理を指す。要素ごとに同じ処理を繰り返し行うことで、データを効率的に操作することができる。
イテレーションは、プログラミングでよく使われる概念であり、データ構造内の要素にアクセスするための手段である。一般的には、反復子(iterator
)やループを使用して、データの各要素に順番にアクセスする。