匿名メソッドをラムダ式に置き換えた書き方
これからラムダ式の書き方を解説して行きます。ラムダ式はこれまで解説してきた匿名メソッドをさらにスリムにした書き方なので,まずは匿名メソッドとどういった点が異なるかを見て行きましょう。
ここまで解説してきた匿名メソッドを例とします。次のケースでは,文字列が3文字の時Tureを返却する匿名メソッドとなりますね。
delegate (string s) { return s.Length == 3;}
前述の匿名メソッドラムダ式にすると次のようになります。
匿名メソッドをラムダ式に変更した場合の書き方
s => s.Length == 3
匿名メソッドとラムダ式の違い
匿名メソッドとラムダ式の違いですが,まずラムダ式では,delegateの記述が不要です。そして最大の特徴はラムダ演算子と呼ばれる「=>」というキーワードを使うことです。日本語にするとラムダ演算子ですが,「=>」は「goes to」(ゴーズ・トゥ)と読みます。初めてこのキーワードを見たときは,戸惑いました。まったく文法が理解できないのです。ただ,これも意味を理解すれば,きちんと読むことができるようになります。
=>とは?
ラムダ演算子「=>」(ゴーズ・トゥ)とは何なのでしょうか?
これは,ラムダ式の左辺と右辺を分ける境目という意味を表しています。
左辺と右辺に分けたうえで,左辺に「パラメータ」,右辺に「式」or「文」要するにメソッドの中身を書くという決まりになっています。このあたりを理解すれば,ラムダ演算子「=>」も怖くなくなります。左辺と右辺の書き方も,当然ラムダ式の書き方のルールがあるで,この後解説していきます。
ラムダ式の書き方のルール
匿名メソッドの時は...
①delegate
②パラメータ(型指定あり)
③メソッド本体
の順番で記載していました。
ラムダ式の場合は...
①パラメータ(型指定不要)
②=>(ゴーズ・トゥ)
③メソッド本体
の順番で記載します。
匿名メソッドとよく似ていますが,ラムダ式の場合は,=>(ゴーズ・トゥ)で区切って,左辺にパラメータ,右辺にメソッド本体を書くのが特徴的です。この=>(ゴーズ・トゥ)キーワードで左辺と右辺を区切ることにより,冗長な中括弧{}を省いたり,いろいろと,匿名メソッドよりもスリムな書き方ができるようになっています。書き方のルールは左辺と右辺に分けて,それぞれ解説していきます。
左辺の書き方
まず,左辺です。前述のとおり,左辺にはパラメータを記載します。
匿名メソッドで書いていた時のdelegateに続く(string s)などの部分です。
delegate (string s) { return s.Length == 3;}
まず,ラムダ式では,delegateキーワードの記載は不要です。それに続くパラメータの部分ですが,これは,パラメータの「数」によって書き方が微妙に異なります。パラメータの数のパターンは3パターンあり,「引数なし」「引数1個」「引数複数」の3パターンです。また,パラメータは,ラムダ式の時と異なり,型指定(この場合stringの記述)は不要になります。それでは,パラメータの数による3パターンの書き方を解説していきます。
パラメータなしの場合
左辺にはパラメータを書くのですが,パラメータが0個の場合は,どうすればいいでしょうか?何も書かないということも考えられますが,それでは書き忘れなのか,意図的に引数なしなのかが,コンパイラに理解できませんね。ですので「引数なし」ということの意思表示が必要になります。それが小括弧()です。
こんな感じに書きます...
() =>右辺は後述するがここはメソッド本体
ラムダ演算子「=>」(ゴーズ・トゥ)で区切り,その左側に小括弧()を記述するとパラメータなしということになります。
具体的にコードを書いてみると,こんな感じです。
() => Console.WriteLine(“通知されました”)
パラメータ1個の場合
パラメータ1個の場合は,使用する変数名を1つ記載するのみで,小括弧の記述は不要です。
実際のコードで書くと,次のような感じになります。
s => s.Length == 3
匿名メソッドであれば(string s)という記述が必要ですが,パラメータ1個の場合のラムダ式は,かなりスリムに記述することができます。
パラメータが複数の場合
パラメータが複数の場合は,複数のパラメータをカンマ区切りで記載します。この場合もパラメータの型の記載は不要です。そして,1個の場合と異なり,小括弧()の記載が必要です。ですので,小括弧が不要なのは,パラメータ1個の場合の時の特権という感じで覚えておいてください。1個の場合以外は,小括弧()が必要になります。
具体的なコードにすると,次のような感じになります。
(a, len) => a.Length == 3 + len
右辺の書き方
ラムダ演算子「=>」(ゴーズ・トゥ)の右側,右辺には,メソッドの本体を書きます。
下記の匿名メソッドでいうところの,{ return s.Length == 3;}の部分になります。
delegate (string s) { return s.Length == 3;}
匿名メソッドのメソッド本体の部分と要領は同じなのですが,メソッド本体の内容によって,2パターンの書き方が存在します。2パターンとは,メソッド本体が,「式」か「文」により異なります。「式」とは「a == 3」のような感じで,if文の()の中に書くような内容や,1行で完結するようなものです。一方「文」は複数のコードに分かれるものです。「変数を宣言して」「代入して」「if文で判断して」「最後にリターン」みたいな感じで,複数のコードに分かれるものが「文」,1つのコードで完結しているモノが「式」です。
右辺が「式」の場合(1つのコードで完結している場合)
1つのコードで完結している場合は,returnの記述が不要です。
匿名メソッドでは,{ return s.Length == 3;}という感じで,returnキーワードが必要でしたが,ラムダ式で,1つのコードで完結している場合はreturnキーワードが不要です。
また,1つのコードで完結している場合は中括弧{}とセミコロン;も不要になります。
実際に記述すると次のようになります。
s => s.Length == 3
匿名メソッドの{ return s.Length == 3;}に比べると,中括弧{},returnキーワード,セミコロン;の記述がないことが確認できます。
右辺が「文」の場合(複数のコードに分かれている場合)
右辺が「文」の場合,すなわち,複数のコードに分かれている場合は,匿名メソッドの時と同じように,中括弧{}を記載し,その中に通常のメソッドと同様の書き方で,コード記載します。要するに匿名メソッドの時と同じになります。
実際のコードにすると,次のような感じになります。
(a, len) => { if (a[0] == 'E') { return a.Length > len; } return false; }
if文などが存在し,複数のコードに分かれているメソッドなので,その全体を中括弧{}で囲って右辺としています。通常のメソッドの中括弧{}の中身と同じということになります。
#02_プロジェクトの作成
#03_ラムダなしで実装
#04_ラムダなしで実装_共通関数
#05_ラムダなしで実装_引数追加
#06_delegateを定義する方法
#07_delegateの使い方
#08_delegate_引数2つ
#09_匿名メソッドの使いかた
#10_Predicateの使い方
#コラム_C#の歴史とここまでのまとめ
#11_ラムダ式の書き方
#12_ラムダ式の実装
#13_FuncとActionとは
#14_Funcの実装とラムダ式複数パラメータの書き方
#15_ラムダの右辺が複数行の時の書き方
#16_Actionのパラメータありの実装
#17_Actionのパラメータありとラムダ式の書き方
#18_Actionのパラメータなしと引数なしのラムダ式の書き方
#19_コレクションに対する代表的なラムダ式の書き方
#20_カスタムクラスのコレクションに対するラムダの書き方