導入
Javaにはラムダ式という便利な機能が備わっているので、その紹介をしていきます。
かなり便利なものなので、きちんと理解することをお勧めします。
ラムダ式とは
ラムダ式は、匿名関数を表現するための簡潔な記法です。
ラムダ式は、通常のメソッドとは異なり、名前を持たず、その場で定義される小さなコードブロックです。
Java 8以降で導入され、コードの簡潔化や関数型プログラミングのサポートに役立っています。
仕組み
ラムダ式は、ローカルクラスと無名クラスの仕組みを利用しています。
なので、これらについてまず触れます。
ローカルクラス
ローカルクラスとは、メソッド内にクラスを定義して利用するものです。
以下に例を示します。
public static void main(String[] args) {
// ローカルクラスLocalTestの定義
class LocalTest {
public void sayHello() {
System.out.println("Hello!!");
}
}
// LocalTestを定義したメソッドの内でLocalTestを利用できる
LocalTest local = new LocalTest();
local.sayHello(); // Hello!!
}
インターフェースを実装したクラスも同様にローカルクラスとして定義することが可能です。
以下の無名クラスの項目に例を載せています。
無名クラス
IFを実装したローカルクラスの定義を省略して書いたものです。
まずはローカルクラスの例です。
public static void main(String[] args) {
class LocalTest implements LocalInterface {
@Override
public void sayHello() {
System.out.println("Hello local class!");
}
}
LocalInterface local = new LocalTest();
local.sayHello(); // Hello local class!
}
これの省略形が無名クラスです。
public static void main(String[] args) {
LocalInterface local = new LocalInterface {
@Override
public void sayHello() {
System.out.println("Hello No name!");
}
};
local.sayHello(); // Hello No name!
}
このように無名クラスという方法を使うと、ローカルクラスの定義とインスタンス化を同時に行うことが可能です。
ラムダ式
ついにラムダ式です。
ラムダ式は、さらに無名クラスからインスタンス化とオーバーライドの宣言を除去したものになります。
上述の無名クラスの例をラムダ式に変換したものが以下になります。
public static void main(String[] args) {
LocalInterface local = () => { System.out.println("Hello Lambda!"); };
local.sayHello(); // Hello Lambda!
}
ここで疑問が浮かんできます。
上記の例ではsayHello
というメソッドが呼び出されていますが、その定義はどこにもありません。
この定義はどこにあるのでしょうか?
この答えは、そもそものローカルクラスや無名クラスの例を見てもらうとわかります。
これらは共通してsayHello
メソッドをオーバーライドしています。
つまり、sayHello
という関数は元々LocalInterface
インターフェースに抽象メソッドとして実装されていることが推測できます。
おそらくLocalInterface
は以下のような実装になっていたと思われます。
public interface LocalInterface {
void sayHello();
}
このようにラムダ式は、シンプルに記述することができる一方で、ローカルクラスや無名クラスとは異なり、メソッド名が分かりにくくなってしまいます。
また、ラムダ式には守らなければならないルールがあります。
インターフェースの抽象メソッドが1つの場合に限るというルールです。
もしインターフェースに複数メソッドがあった場合、どのメソッドをオーバーライドするかわからなくなってしまうため、この点にも注意が必要です。
ラムダ式のメリット
というデメリットがラムダ式にはありますが、当然以下のような大きなメリットがあります。
- コードの簡潔化: ラムダ式を使うことで、コードが短く明確になります。
- 関数型プログラミングのサポート: Javaの関数型インターフェース(例: Function)と組み合わせることで、より柔軟なコーディングが可能です。次回以降で「関数型インターフェース」に触れていこうと思います。
- メソッド参照との連携: メソッド参照と共に使用することで、さらにコードの可読性が向上します。
こういったメリットを活かせる実装を行なっていくことが大切です。
終わりに
Javaのラムダ式は、コードをよりシンプルで読みやすくしてくれるツールです。ローカルクラスや無名クラスに対する理解があれば、ラムダ式の概念もスムーズに理解できるでしょう。
一方で、難解な処理に対して利用すると逆に可読性が損なわれる可能性もあるので、使用時には注意が必要です。
とはいえラムダ式は便利な機能です。
ぜひ、今回学んだ内容を実際の開発で活用し、コードの質を向上させてみてください。