ラムダって何なの?
まず初めに
この記事を読むとラムダについて理解できるようになる。
今回の内容の目的
- ラムダってなんなん?という状態を抜け出す
ラムダとは
ラムダ式とは、無名関数を表現するための構文のこと。
ラムダ関数とはラムダ式をコンパイルした結果を得られる関数オブジェクトのこと。
サンプルコード
まず、ラムダのとてもシンプルなサンプルコードを見ていきます。
// xを受け取ってxの2乗をするラムダ式
Function<Integer, Integer> square = x -> x * x;
// 呼び出し
System.out.println(square.apply(5)); //25
ポイント
xを引数として受け取り、->の先でxの処理を記載します。->を矢印だと思えばわかりやすいかなと。
xが->x*xこんな感じで処理されます。っていつも唱えています。(笑)
そのあと、squareを.applyして実行5*5の答えは25といった流れです。
ラムダのFunctionインターフェースを使用するときは.applyをすることで実行することができます。
適用するという意味でFunctionをこの場所で使うとか、実行するみたいなイメージが近いのかなと思います。
ラムダのインターフェースは他にも引数を取らないもの、引数を取って戻り値がないもの、戻り値だけあるものなどなど様々用意されていますが、今回はFunctionに絞っています。
Functionの意味さえ理解できれば他は派生系なので場合によっては使い分けることができます。
ちなみにFunctionの中の<Integer,Integer>
1番目が引数の型、2番目が戻り値の型になる。
Function <Integer, Integer>
↑ ↑
引数の型 戻り値の型
ここで私が思ったことですが、ラムダ式って無名関数だよね?無名って言ってるけどsquareって名前つけてるじゃん!無名関数とは!?
サンプル式↓
// xを受け取ってxの2乗をするラムダ式
Function<Integer, Integer> square = x -> x * x;
そんなことを思ったのですが、
ラムダ式というのはここ↓の部分のこと。
x -> x * x
この部分に名前はない。この部分がラムダ式。
squareというのはプログラム作成者が作った関数名。
つまり、
無名関数を関数に代入している
という状態。だから関数に名前あるじゃん!と思ってしまっていました。
普通の関数との比較
// 普通の関数
public static int square(int x) {
return x * x;
}
普通の関数の場合はsquareという名前の関数を宣言して、その中に処理を記載している。
ここでラムダと普通の関数の違いをもう一度整理すると、
- 普通の関数は、関数名をつけて宣言してその後に処理を記載する。
- ラムダ関数は、無名関数の処理をapplyなどで実行する。
ポイントとしては、関数を変数の中に代入できる。関数に名前をつけずに実行することができる点です。
次は、なぜこのような特徴を持った関数が便利なのか、どんな時に使うと効果的なのかについて整理していきます。
Discussion