だいぶ前にJavaGold(SE7)の試験を受けたんですが、ラムダ式がギリギリ試験範囲に入っておらず、ずっと名前だけ知っている状態が続いていたのでこの機会に調べてみました。
どんな特徴があって、どんな時にどう使えるのか。が伝わることを目的に紹介します。
1. ラムダ式とは
Java8から登場した「記述方式」のこと。
関数型インターフェースを簡単に記述するために用いられる。
※関数型インターフェースは、抽象メソッドを一つだけ持つインターフェース
つまり、抽象メソッドを複数持つインターフェースには使えないという制限がある。
<関数型インターフェース>
■Runnable
スレッドを作る時に使うインターフェースで、抽象メソッドとしてrun()を持つ
■Comparable
順序比較する時に使うメソッドで、抽象メソッドとしてcompareTo()を持つ
<使用できないケース>
■Iterator
hasNext() と next() の2つのインターフェースを持つため、ラムダ式は使えない。
2. 使用するメリット
- コードがシンプルで見やすくなる
- 並列化や遅延実行がしやすい
これが1番のメリットだと思いますが、コードがシンプルになるので、かなり見やすくなります。
ただし、引数の型が省略することができるので、「型を省略せず書く」「コメントに記載する」「変数名を適切に書く」等のルールが必要かもしれません。
また、処理自体を値として渡せるので、並列化や遅延実行がしやすいです。
言葉だけだとちょっとイメージしにくいですが、処理が1単位として扱われるので「この処理を並列に実行する」の操作がやりやすくなります。
3. 使い方
Runnableを使った例
まずはラムダ式を使わない場合。
続いてラムダ式を使った場合。
「new Thread」はコンストラクタで「Runnable」を受け取ります。
そしてラムダ式では処理をそのまま記載すればOKで、かなりシンプルにコードを書くことができます。
JavaScriptのアロー式っぽいですね。
自作インターフェースを使った例
関数をラムダ式でシンプルに実装し、applyメソッドを実行した処理です。
処理自体もシンプルで分かりやすいのと、applyメソッドの遅延実行や並列実行もやりやすい、というのはなんとなくイメージできるかと。
4. まとめ
- ラムダ式とは「記述式」のこと
- 関数型インターフェースに対して使用可能
- 複数の抽象メソッドを持つインターフェースには使用できない
- ラムダ式を使うと簡単かつシンプルに記述できる
つまり、こういうことかな。