メソッド参照/ラムダ式
Java8では、メソッドも型の一種だそうです。メソッドそのものもまた、他の数値型や文字列型と同じく、別のメソッドの引数として渡すことができます。そして、メソッドを受け渡しするための構文が、メソッド参照であり、ラムダ式です。
ラムダ式の基本
Main.java
package com.company;
public class Main {
public static void main(String[] args) {
var data = new String[] { "春はあけぼの", "夏は夜", "秋は夕暮れ" };
var ml = new MethodLambda();
ml.walkArray(data, (String value) -> {
System.out.printf("[%s]\n", value); // Macでは\nと書かないと改行されない!、Windowsは¥n
});
}
}
MethodLambda.java
package com.company;
import java.util.function.Consumer;
public class MethodLambda {
public void walkArray(String[] data, Consumer<String> output) {
for (var value : data) {
output.accept(value);
}
}
}
実行結果
[春はあけぼの]
[夏は夜]
[秋は夕暮れ]
メソッド参照/ラムダ式を利用しない例
Main.java
package com.company;
public class Main {
public static void main(String[] args) {
var data = new String[] { "春はあけぼの", "夏は夜", "秋は夕暮れ" };
var ml = new MethodLambda();
ml.walkArray(data);
}
}
MethodLambda.java
package com.company;
public class MethodLambda {
public void walkArray(String[] data) {
System.out.printf("ラムダ式を利用しない例\n");
for (var value : data) {
System.out.printf("[%s]\n", value);
}
}
}
実行結果
ラムダ式を利用しない例
[春はあけぼの]
[夏は夜]
[秋は夕暮れ]
ラムダ式を表すのは、以下の構文です。引数リストと本体ブロックを「->」でつなぎます。
(引数型 仮引数) -> {
...メソッドの本体...
}
ラムダ式によって名前がなくなっただけでなく、walkArrayメソッドを呼び出すためのコードに、メソッド定義を直接埋め込めるようになります(これが「名前が不要で、その機能だけが必要な場合といった意味です。)これによって、コードが短くなったのはもちろん、コードのまとまりがはっきりしたため、格段に読みやすくなりました。
walkArrayメソッドの引数型として指定されているConsumaerインターフェイスは、標準ライブラリ(java.util.functionパッケージ)で提供されている関数型インターフェイスです。
@FunctonInterface
public interFace Consumer<T> {
void accept(T t);
}
Tは、ジェネリクスの型パラメーターです。Consumaerであれば、T型の引数を受け取り、なんらかの処理を実行する(戻り値はない)メソッド型を表します。
最後に
Stream APIというものでは、ラムダ式の利用を前提としているので、必要なスキルです。ラムダ式を覚えれば従来のコードをシンプルにできるので、今後はこれを習得しないと人の書いたソースコードも読めないのだろうと思う...