社内se × プログラマ × ビッグデータ

プログラミングなどITに興味があります。

Java challenge methodReference

なにが出力される?

public static void main(String[] args) {
	List<String> castlevania = new ArrayList<>();
	castlevania.add("Dracula");
	castlevania.add("Alucard");
	castlevania.add("Trevor");
		
	List<String> castlevaniaResult = new ArrayList<>();
		
	Consumer<String> c1 = System.out::println;
	Consumer<String> c2 = castlevaniaResult::add;
	Consumer<String> c3 = c -> castlevaniaResult.removeIf(e -> e.matches("Trevor"));
		
	castlevania.forEach(c2.andThen(c1).andThen(c3));
		
	System.out.println(castlevaniaResult);
}

考察
Consumer が初見だったので調べてみたところ、”引数を消費するインスタンスを定義するためのインターフェイス”とのこと。
castlevania.forEach で最初に c2 に引数が渡されていることになるので、
まず、castlevaniaResult に castlevania の全ての要素が格納されることになるはず。
次に, c1 に引数が渡されるので、全ての要素がここでまず出力されるはず。
Dracula
Alucard
Trevor
そして、c3 に引数が渡されるので、castlevaniaResult から Trevor が除外されるはず。
最後に castlevaniaResult を出力しているので、以下の2つの要素が出力されるはず。
Dracula
Alucard

結果
Dracula
Alucard
Trevor
[Dracula, Alucard]

最後は、List が System.out.println の引数に渡されていたので、リスト形式で出力されるのを失念してしまいました。
Consumer とか、Java8 から登場した関数型のインタフェースみたいですが、Java8 の基礎みたいなので、別で調査してみたいです。