2
3

More than 1 year has passed since last update.

Javaの::ってなんだ?

Posted at

こんな意味らしい???

メソッド参照の構文

対象 構文
クラスメソッド クラス名::メソッド名
インスタンスメソッド オブジェクト変数::メソッド名
コンストラクター クラス名::new

メソッド参照の基本

MethodRefUse.java

package com.company;

public class MethodRefUse {
    // 配列の要素の処理方法をメソッド参照で受け取れるように
    public void walkArray(String[] data, Output output) {
        for (var value : data) {
            output.print(value);
        }
    }

    // Output型に対応したメソッド(渡された文字列をブラケットでくくる)
    static void addQuote(String value) {
        System.out.printf("[%s]\n", value);
    }
}

Output.java

// インターフェイスのファイル
package com.company;

// String型の引数を受け取り、戻り値はvoid型であるメソッド型
@FunctionalInterface
public interface Output {
    void print(String str);
}

Main.java

package com.company;

public class Main {
    public static void main(String[] args) {
       var data = new String[] { "春はあけぼの", "夏は夜", "秋は夕暮れ" };
       var u = new MethodRefUse();
       u.walkArray(data, MethodRefUse::addQuote);
    }
}


walkArrayメソッドに対して、配列要素を処理するコードだけを切り出して、あとから引き渡せるようにした例です。

メソッドの差し替えも可能

インターフェイスのファイルのOutput.javaは削除されるとエラー出るので消さないように!!!
新たにファイルを追加したディレクトリの構造↓

.
├── SampleJava.iml
├── data.txt
├── out
│   └── production
│       └── SampleJava
│           └── com
│               └── company
│                   ├── Counter.class
│                   ├── Main.class
│                   ├── MethodRefUse.class
│                   └── Output.class
└── src
    └── com
        └── company
            ├── Counter.java
            ├── Main.java
            ├── MethodRefUse.java
            └── Output.java

次は、walkArrayメソッドを使って、配列内の文字列をカウントする例です。
Counter.java

package com.company;
// 文字列をカウントするためのCounterクラス
public class Counter {
    private int result = 0;

    public int getResult() {
        return this.result;
    }

    public void addLength(String value) {
        this.result += value.length();
    }
}

MethodRefUse.java

package com.company;

public class MethodRefUse {
    // 配列の要素の処理方法をメソッド参照で受け取れるように
    public void walkArray(String[] data, Output output) {
        for (var value : data) {
            output.print(value);
        }
    }

    // Output型に対応したメソッド(渡された文字列をブラケットでくくる)
    static void addQuote(String value) {
        System.out.printf("[%s]\n", value);
    }
}

Output.java

// インターフェイスのファイル
package com.company;

// String型の引数を受け取り、戻り値はvoid型であるメソッド型
@FunctionalInterface
public interface Output {
    void print(String str);
}

Main.java

package com.company;

public class Main {
    public static void main(String[] args) {
       var data = new String[] { "春はあけぼの", "夏は夜", "秋は夕暮れ" };
       var u = new MethodRefUse();
       var c = new Counter();
       u.walkArray(data, c::addLength);
       System.out.println(c.getResult());
    }
}

実行結果

14

解説

CounterクラスのaddLengthメソッドは、引数valueの文字列をresultフィールドに足し込んでいるので、walkArrayメソッドはそれ全体として、配列に含まれる文字列の長さの合計を求めることになります。
ここで、おおもとのwalkArrayメソッドは一切書き換えていない点に注目してください。メソッド参照を利用することで、枠組みとなる機能(ここでは配列を順に走査する部分)だけを実装しておき、詳細な機能はメソッドの利用者が決める---より汎用性の高いメソッドを設計できるようになります。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3