result}この関数は次のように呼び出せる。スタイル1のコードが書ける。}ラムダ式と無名関数ラムダ式または無名関数は「関数リテラル」である。関数は宣言されていないけど即座に式として渡せる。次の例を考えてみよう。高階関数、つまり2つ目の引数として関数を取る。関数として等価なのは以下になる。引数として他の関数をとるためには、その関数の型を指定しないといけない。以下のように定義される。2つの引数を渡して呼び出している。ラムダ式の書式ラムダ式の完全な書式は以下になる。}ラムダ式は波括弧で括られ、波括弧の中にあるその引数の型はオプション。引数の型を外に出すと次のようになる。}無名関数ラムダ式の書式で1つ抜け落ちているのは戻り値の型。y名前がない以外は普通の関数と見た目は一緒。中身は式でもブロックでもいい。y}パラメータや戻り値の型は文脈から推論できるなら省略できる。戻り値の型の省略に関しては普通の関数とルールは同じ。括弧の外には出せない。これは以前も説明した。した場合、ラムダは外側の関数を抜けるが、無名関数はその無名関数自身を抜ける。クロージャ(ローカル関数やオブジェクト式と同様に)ラムダ式や無名関数はその外側で宣言された変数にアクセスできる。違ってクロージャにキャプチャした変数を変更できる。レシーバ(そのメソッドを呼び出されるオブジェクト)を指定して関数リテラルを呼び出す方法を提供している。関数リテラルのボディの中で、そのオブジェクトのメソッドを呼び出すことができる。これは拡張関数に似ている2。スタイルのビルダーである。レシーバ付きの関数リテラルの型は次のようになる。Intこれはまるでレシーバオブジェクトのメソッドであるかのように呼び出せる。呼び出す1.sum(2)無名関数の書式なら関数リテラルの型を直接指定できる。これはレシーバ付き関数型の変数を宣言して、後でそれを使う場合に便利。自身と引数otherを足した値を返すレシーバ付きラムダ式は文脈からレシーバの型が推論できる場合に使える3。レシーバオブジェクトのメソッドを呼び出す。高階関数を使うことは幾らかの実行時のペナルティがあることを暗示している。これらの関数はオブジェクトであり、関数ボディからアクセスできるように外部環境をキャプチャする。メモリ確保と仮想関数呼び出し4は実行時のオーバーヘッドとなる。多くの場合この種のオーバーヘッドはラムダ式をインラインにすることで除去できる。関数はその良い例で、簡単に呼び出し側でインライン展開できる。次の場合を考えてみよう。渡す関数オブジェクトを生成してそれを呼び出すコードを生成する代わりに、コンパイラが次のコードを吐き出してくれたなぁ。修飾子を付ける必要がある。...}インラインは生成されるコードの肥大化を招く。妥当なやり方(つまりデカい関数をインラインにしない)をすれば、パフォーマンス上の効果を生む5。修飾子を付けることができる。...}インライン化できるラムダは関数の中で呼び出すか、インライン化できる引数として渡すことしかできない。付けられたものは何とでも好きなように操作することができる。フィールドに格納したり、持ち回したり。注:もしインライン関数がインライン可能な関数パラメータも持たず、具象化型パラメータ(後述)も持たないなら、コンパイラは警告を発する。それらの関数をインライン化することにメリットがあるとは思えないので(もしインライン化が必要だとはっきりしているなら、警告を抑制できる)。(無名含む)関数を抜けるけど、ラムダを抜けるにはラベルが必要。インライン展開されるのでこう書いてもいい。ラムダはインライン展開されて、returnの意味もfoo内に直接書いたのと同じになる。インライン関数を使うループの中でこんな感じに利用するのに向いてる。false}インライン関数は渡されたラムダを関数ボディ内から直接呼び出すだけでなく、他の実行文脈から呼び出すこともある。ローカルオブジェクトやネストされた関数のような。いう場合、ローカルでないフロー制御は許可されない。修飾子を付ける必要がある。crossinlineを付けたので、bodyに渡すラムダはローカルなフロー制御を使ってはいけない。この関数の呼び出し元でそのようなラムダを渡すとコンパイルエラーになる。インラインのラムダ内で利用できないけど、将来サポートしようとは思ってる。具象化型パラメータしばしばパラメータとして渡された型にアクセスする必要がある。T}ここではリフレクションを使ってノードがある型かどうかをチェックしている。うまく動くけど、呼び出す側は綺麗に書けない。myTree.findParentOfType(MyTreeNodeType::class.java)実際にやりたいことは、単にこの関数に型を渡したいだけ。