質問: Arrays.asList("Pochi", "kenta", "Chiro"); //メソッド参照を使って出力する dogs.forEach(System.out::println); } } ``` 上記のコードで結果が Pochi kenta Chiro と出るのですがなぜそうなるのかがわかりません。 foreachはたくさん出てくるのですがforEachについては書いてあるところでは 難しかったのでお手数ですが宜しくお願いします。
回答: Java8で登場した関数型インタフェースとともに登場した記述法ですね。 まず、このforEachというメソッドはConsumerという型のオブジェクトを要求しています。Consumerは、何らかのオブジェクトを受け取って「何かをする」というものです。その「何か」を簡略化して書けるようにしたのがこのメソッド参照です。ここではSystem.outが持つprintlnというメソッドを使います、という意味になります。 で、この「何かをする」というものに、Listは自分の持っているオブジェクトを順番に送るのです。この場合、Listが持っている"Pochi", "kenta", "Chiro"を順番に「何か」、つまりSystem.out.printlnという行動をすることになります。 この書き方をせず、旧来の書き方で書くとするならこうなります。 ``` dogs.forEach(new Consumer{ //Listの型であるStringか、その親クラス、インタフェースの型のConsumerである必要がある @Override public void accept(Object o){ //「何かをする」メソッド System.out.println(o); //内容が1文で、かつacceptに渡る引数がそのまま渡る場合に、メソッド参照で書ける } }); ``` で、forEachでどうなっているかというと、イメージですが、 ``` //List内部 public void forEach(Consumer super String> action){ for(String s : this){ action.accept(s); //「何かをする」Consumerに自分のリストの中身を順番に渡す } } ``` つまり、Listの中身を順番に取り出し、まずConsumerオブジェクトのacceptメソッドに渡ります。 そして、acceptメソッドで受け取ったオブジェクトをSystem.out.printlnメソッドに渡して出力します。