SE7までIterableインタフェースにはiterateメソッドしか定義されていなかった。
SE8ではIterableインタフェースに次の2つのデフォルトメソッドが追加された。
・default void forEach(Consumer action)
・default Spliterator spliterator()
forEach()メソッドは拡張for文の内部イテレータ版になる。
forEach()メソッドの引数の型はjava.util.function.Consumerインタフェースとなっている。
forEach()メソッドの内部処理は次のようになっている。
for (T t : this)
action.accept(t);
Consumerインタフェースには次の2つのデフォルトメソッドがある。
・void accept(T t)
・default Consumer andThen(Consumer after)
Consumerインタフェースでは、accept()メソッドで処理を定義する。
また、andThen()メソッドはaccept()の処理後に続けて処理を実行する合成Consumerを返す。
List<String> texts = ...;
// 拡張for文
for (String text: texts) {
System.out.println(text);
}
// forEach + 匿名クラス
texts.forEach(new Consumer<String>() {
@Override
public void accept(String text) {
System.out.println(text);
}
});
// forEach + ラムダ式
texts.forEach(text -> System.out.println(text));
forEachメソッドは拡張for文と同じように使用できるが、ローカル変数へのアクセスはfinalもしくは実質的finalである必要がある。
spliterator()メソッドはパラレル処理時に使用される(ここでの説明は略)。