質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • Java

    14145questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

メソッド参照について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 965

sobue

score 166

import java.util.Arrays;
import java.util.List;

public class MethodRefarence {

    public static void main(String[] args) {
        // TODO 自動生成されたメソッド・スタブ
        List<String> dogs = Arrays.asList("Pochi", "kenta", "Chiro");
        //メソッド参照を使って出力する
        dogs.forEach(System.out::println);
    }

}


上記のコードで結果が
Pochi
kenta
Chiro
と出るのですがなぜそうなるのかがわかりません。
foreachはたくさん出てくるのですがforEachについては書いてあるところでは
難しかったのでお手数ですが宜しくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

Java8で登場した関数型インタフェースとともに登場した記述法ですね。

まず、このforEachというメソッドはConsumerという型のオブジェクトを要求しています。Consumerは、何らかのオブジェクトを受け取って「何かをする」というものです。その「何か」を簡略化して書けるようにしたのがこのメソッド参照です。ここではSystem.outが持つprintlnというメソッドを使います、という意味になります。

で、この「何かをする」というものに、Listは自分の持っているオブジェクトを順番に送るのです。この場合、Listが持っている"Pochi", "kenta", "Chiro"を順番に「何か」、つまりSystem.out.printlnという行動をすることになります。

この書き方をせず、旧来の書き方で書くとするならこうなります。

dogs.forEach(new Consumer<Object>{  //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メソッドに渡して出力します。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/14 10:21

    内容を理解するためにConsumer<? super String> actionの部分が調べたいんですが
    なんていう構文かわからないため調べられないです。

    キャンセル

  • 2016/05/14 13:59

    「ワイルドカード」と呼ばれているものです。ここでの意味は、旧来の書き方1行目のコメントに書いているようなことです。

    キャンセル

  • 2016/05/14 23:09

    ありがとうございます。いつも的確に答えてくださって助かっています。
    それとともにどうやって勉強してらっしゃるのかが気になります。

    キャンセル

  • 2016/05/14 23:25

    このあたりはJava8のStream APIが気になって色々調べましたね。
    あとはまあ実際に使ってみて理解していきました。

    キャンセル

0

これは、ちょっと高度な構文だよ。

forEachの引数で指定された関数(ここではprintln)の引数に、リストの各要素を与えて実行する。という意味だけど、分かる?自分でも書いててややこしい、「引数」が2回出てきているので注意。

要するにprintlnの引数としてリストの各要素を与えていくようなこと。ただ、最初のうちはあまり使わないやり方だよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/13 23:00 編集

    引数は基本かっこでくくりますが、この場合はメソッド(println)で引数が渡せるということですね?さらにそのprintlnにも引数があってそれをdogsから持ってきてコンソールに出力しているということでいいのでしょうか?

    キャンセル

  • 2016/05/13 23:23

    たぶん意味はあってると思うけど、どうしてもややこしい。

    「引数は基本かっこでくくる」というのはその通り。ただし、関数自体(関数の戻り値ではなく)も意味のあるものなので、「関数そのもの」を差し示す書き方(引数や小括弧を書かない)も実在するよ。

    キャンセル

  • 2016/05/14 10:18

    ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    14145questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。