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
Consumer とか、Java8 から登場した関数型のインタフェースみたいですが、Java8 の基礎みたいなので、別で調査してみたいです。