ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
名前のない関数の表記法。ラムダ関数、あるいは単にラムダとも。
例えばC++であれば、std::sort、std::for_eachなどを使うにあたって、比較関数の定義が必要である。このためにclassを定義したりといった無駄が発生することになるが、中でやることなど1行で済む計算式程度なので、std::sortなどの引数の中に関数が定義できれば便利である。この方法がラムダ式である。
またKotlinの場合であれば、例えばAndroidプログラミングでリスナーの定義をする場合によく使われる。Javaであればリスナーを定義する関数の引数にリスナーそのものを入れる書き方がよくなされる。Better JavaであるKotlinも同様ではあるが、ここでJavaとは異なりラムダ式を記述することが可能で、これによってオーバーライドしたりする記述を大幅に減らすことができる。
記述方法は言語ごとに様々だが、関数定義の形式を取りながら名前を持たないのが特徴である。
C#では、C# 2.0から匿名メソッドというほぼ同等の機能が搭載されたが、これをよりシンプルで書きやすくしたものとして、C# 3.0からラムダ式が導入された。
まず参考に、匿名メソッドの基本的な記述方法は、次のようなものである。
delegate(int x, int y) { return x + y; }
これと同様の機能を持つラムダ式は、次のように書かれる。
(x, y) => x + y
つまり、f(x)=x+1をx => x+1と書けるというものである。
C++でも、C++の第三版ISO/IEC 14882:2011(C++11)から導入された。但し書式はC#とは異なる。
C++のラムダ式は、[]、()、{}、という三つのブロックで構成される。
ラムダ式は()内の引数を取り{}内の処理を実行する無名の関数オブジェクトとして振る舞う。
ラムダ式は関数であるので戻り値が存在するが、通常は型推論機能「decltype」が機能し(これもC++11からの新機能)、戻り値の型は省略することが可能。もし明示的に記述する場合は、[]()->type{}の構文になる。
最も基本的な記述方法は、次のようなものである。
[](int x, int y) { return x + y; }
このラムダ式の返却値の型は、return文に書かれているx+yの型、つまりdecltype(x+y)である。
返却値の型を明確にしたい場合は、次のように書くこともできる。
[](int x, int y) -> int { return x + y; }
クロージャー変数の定義も可能。
int n = 123;
[n](int x) -> int { return x * n; }
Kotlinにおけるラムダ式の基本的な書式は次の通りである。
val sum = { x: Int, y: Int -> x + y }
つまり、{ 引数 -> 関数の中身 } のように記述することになる。{}内の引数の変数の型はオプションであり、推論可能な場合は省略できる。
引数の型は外に出すこともでき、次のように書いても意味が同じになる。
val sum: (Int, Int) -> Int = { x, y -> x + y }
KotlinでAndroidプログラミングをする場合、例えばリスナーを設定する関数ごとに想定されたメソッドを使う場合には一々overrideの関数を書いたりする必要なく、ラムダ式を与えるだけで済む。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます