ラムダ式とは
関数型言語由来の概念。
関数型言語とは「関数を値と同じ様に扱える」言語。
"値"というのは数値とか文字列とかリストとか。
値と同じ様に扱えるとは、
- 変数に代入できて
- 関数の引数に渡せて
- 関数の戻り値にできる
ということ。
例えば、引数に値をとり、それに10を足して返す関数
F(x) = x + 10
のような関数。
関数型言語ではこの関数を値として取り回せる。
では、上記の関数を変数に代入するにはどうすればよいか。
この「値として取り回せる関数の書き方」がラムダ式。
例えば、関数型言語のHaskellでは上記の関数は
f = x -> x + 10
というふうに記述できる。
「【数値xを受け取り、それに10を足した値を返す関数】を、fという変数に代入した」と思って下さい。
この書き方は言語により異なるが、どれもラムダ式である。
どれも「値として取り回せる関数の書き方」を定義したものだから。
-> とか => とか細かな書き方の違いは関係ありません。
と、ここまでがラムダ式の話なのだがJavaやC#では少々事情が異なる。
これらはクラスあっての言語なので関数はクラスの中、つまりメソッドという形でしか存在できないからです。
なので、function(C#だとFunc)インターフェイスを作り、擬似的に関数として取り回せる様にしている。
例えばJavaで
Function<Integer, Integer>f = new Funciton<>(){
public Integer apply(Integer x){
return x + 10;
}
}
の省略記法に過ぎないわけです。
単なるインスタンスなので、変数に代入できるし、引数にも戻り地にも出来る、というわけです。
以上がラムダ式の説明になります。
- 「そもそもラムダ式とはなんなのか」
- 「(関数型言語由来の概念である)ラムダ式を、オブジェクト志向言語に落とし込むには?」
がごっちゃになると一気にわけがわからなくなるので、この2つは分けて考えたほうが良いですね。