普段から何気なくラムダ 式記法を使って実装をしていますが、ラムダとはそもそも、どういう仕組みになっているのか改めて調べてみました〜。
Javaのラムダ式とは
Javaのラムダ式とは、ざっくり言ってしまうと、メソッドが1つしかないインターフェイスを簡単に実装するための記法
です。
色々記述を省略した結果として、ラムダ記法が生まれているので、
本来、ラムダ式を使わずに書くとしたらどうなるのか?というところから説明を始めます。
サンプル1
public interface CalculatorInterface {
public int calculate(int a, int b);
}
public class MultiplyCalculator implements CalculatorInterface {
@Override
public int calculate(int a, int b) {
return a * b;
}
}
public class Main {
public static void main(String[] args) {
CalculatorInterface multiplyCalculator = new MultiplyCalculator();
int result = multiplyCalculator.calculate(2, 5);
System.out.println(result); // 10が表示
}
}
掛け算を行うメソッドを持つMultiplyCalculator
クラスがCalculatorInterface
を実装する形です。これは基本的な形ですね!!
ただ、実はわざわざMultiplyCalculator
クラスを作らずに実装する方法があります。
それが次のサンプル2です。
サンプル2
package sample2;
public interface CalculatorInterface {
public int calculate(int a, int b);
}
package sample2;
public class Main {
public static void main(String[] args) {
CalculatorInterface multiplyCalculator = new CalculatorInterface() {
@Override
public int calculate(int a, int b) {
return a * b;
}
};
int result = multiplyCalculator.calculate(2, 5);
System.out.println(result); // 10が表示
}
}
MultiplyCalculator
クラスを作らず、mainメソッド内で上記のように書くことで実装できます。
CalculatorInterface multiplyCalculator = new CalculatorInterface() {
@Override
public int calculate(int a, int b) {
return a * b;
}
};
この部分ですが、これはCalculatorInterface
をimplementsする無名クラス(名前を持たないクラス)を生成し、その場でメソッドの実装を行っている形となります。
でも、実はもっと簡単に書けるんです、、!それが次のサンプル3になります。
サンプル3
package sample3;
public interface CalculatorInterface {
public int calculate(int a, int b);
}
package sample3;
public class Main {
public static void main(String[] args) {
CalculatorInterface multiplyCalculator = (a, b) -> {return a * b;};
int result = multiplyCalculator.calculate(2, 5);
// returnだけなら、{}も省略できます
CalculatorInterface multiplyCalculator2 = (a, b) -> a * b;
int result2 = multiplyCalculator2.calculate(3, 4);
System.out.println(result); // 10が表示
System.out.println(result2); // 12が表示
}
}
もっとすっきりしましたね!CalculatorInterface
はメソッドが1つしかないので、どのメソッドをオーバーライドするのかが明白です。そんな場合、下記のような形で簡単にメソッドの実装内容を記述することができます。
CalculatorInterface multiplyCalculator2 = (a, b) -> a * b;
これがいわゆるラムダ式というやつです。こんな感じで、記法の省略を重ねるとラムダ式に達するんですね〜!
説明はこれで終わりです。
分かりにくいところあればコメントください〜