こんな意味らしい???
メソッド参照の構文
対象 | 構文 |
---|---|
クラスメソッド | クラス名::メソッド名 |
インスタンスメソッド | オブジェクト変数::メソッド名 |
コンストラクター | クラス名::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メソッドは一切書き換えていない点に注目してください。メソッド参照を利用することで、枠組みとなる機能(ここでは配列を順に走査する部分)だけを実装しておき、詳細な機能はメソッドの利用者が決める---より汎用性の高いメソッドを設計できるようになります。