対象読者
ListやSetの中身を順番に出力する際、以下のように書けることを知っているが、なぜそのように書けるのかが分からないJavaの初心者。
forEach
List<String> list = List.of("a", "b", "c");
list.forEach(a -> System.out.println(a));
// もしくはこう↓
list.forEach(System.out::println);
本記事で少し解消される疑問
Q1.forEachメソッドは何者?
Q2.forEachはなぜ a -> System.out.println(a) のように書ける?
forEachを理解するための前提知識と回答
forEachについて理解するためには周辺の知識も理解しなければならない。上から順に単語を追って見ていこう。
| 単語 | 何? |
|---|---|
| インターフェース | implements(実装)したクラスに抽象メソッドのオーバーライドを強制する |
| 抽象メソッド | 具体的な処理の中身を持たないメソッド |
| 関数型インターフェース | 抽象メソッドを一つだけ持つインターフェース |
| forEachメソッド | Iterableインターフェース内で定義されている。引数はConsumer<T>型 |
| Tってなに!? | Type(型)の意。筆者の独自定義ではなくジェネリクスの型パラメータというものだが、本記事では扱わない |
| Iterableインターフェース | Collectionインターフェース、Mapインターフェースはこれを実装している |
| Consumerインターフェース | void accept(T t)という抽象メソッドを持ち、これは引数を受け取り結果を返さない。A1.forEachメソッドはこのvoid accpet(T t)をオーバーライドしたもの |
A2.関数型インターフェースはラムダ式で書けるから。
↑ Q.いやラムダ式って何?
↑ Q.ラムダ式について調べてみたら書き方がだいぶ違うみたいなんだけど?
これらの疑問については既存の記事に詳述されているので以下を参照されたい。