#なんと便利なラムダ式
##はじめに
この断りを書かないと怒られそうなので。
「今回紹介するのはラムダ式のごく一部です」
ラムダ式、クエリ式に興味を持ってもらえたらいいな~という程度です。自分が使っていて便利だなと感じた場面をいくつか紹介しようと思います。何卒御容赦下さい。ちなみに言語はC#です。
##ラムダ式・クエリ式とは
ラムダ式・クエリ式とは、本来ならば関数を定義するところを簡単に1行で書けたり、配列を直感的に操作できるすごい奴だよ。
ラムダ式・クエリ式とまとめて書きましたが、今回紹介するのはラムダ式のみになります。
正直ラムダ式紹介するだけでも知らない方からすれば結構楽しんでもらえると思います。自分自身初めて触れたときには「プログラミングって案外ラフなんだなー」と感心したものです。
##ラムダ式の書き方
基本的にラムダ式と言うと=>
や->
といった矢印が用いられていることが多いです。(もしかしたら他にも記法があるのかも?)
一般的にプログラミングの関数はC++
ならint function()
やPython
ではdef function()
等、名前をはじめに決めて処理を内部に書くことが基本ですが、簡単な関数、ましてや1度や2度しか使わない関数にも同様に名前を付けて使わなければならない場面があったりします。しかしと言うかやはりと言うかモブみたいな関数に一丁前に名前を付けて主役級の関数と同じ扱いをするのは疲れてくるわけです。
そこでいよいよ登場**「ラムダ式」となるわけですが、ラムダ式はDelegate
やAction
といった匿名関数(無名関数)の延長線なので、詳しく知りたい方は調べてみると面白いかもしれません。繰り返しになりますが本ページでは「ラムダ式のごく一部」**しか紹介しませんので悪しからず。
##実際に書いてみよう
###簡単な例
####ソースコード
using System;
using System.Linq;
class Program {
static void Main(string[] args) {
string str = "Hello World";
//for-each
Console.WriteLine("for-each");
foreach(string s in str.Split(' ')) {
Console.WriteLine(s);
}
Console.WriteLine("");
Console.WriteLine("lambda");
//ラムダ式
str.Split(' ').ToList().ForEach(s => Console.WriteLine(s));
}
}
####実行結果
for-each
Hello
World
lambda
Hello
World
**「文字列"Hello World"を空白で分割してそれぞれ配列に格納して各要素を出力する」**ということをforeach
と=>
でそれぞれ書いてみました。言わずもがなfor
を使うこともできますが、その場合は少しだけforeach
に比べて書く文字数が多くなります。
ForEach()
を使うと怒られるかもしれませんが、これはあくまで簡単な例ということで。(ForEach()
はラムダ式を用いる、つまりDelegate
を生成している分、単純なfor
やforeach
等よりもリソースを食う可能性がある。)
###実用的な例
####ソースコード
using System;
using System.Linq;
class Program {
static void Main(string[] args) {
string str = "0, 1, 2, 3, 4, 5, 6, 7, 8, 9";
//for-each
Console.WriteLine("for-each");
//文字列型配列の宣言と初期化
string[] strArray = str.Split(',');
//整数型配列の宣言
int[] num_foreach = new int[strArray.Length];
//インデックス変数の宣言と初期化
int i = 0;
//整数型配列の代入
foreach(string s in strArray) {
num_foreach[i] = int.Parse(s);
i++;
}
//整数型配列の各要素の出力
foreach(int n in num_foreach) {
Console.WriteLine(n);
}
//ラムダ式
Console.WriteLine("");
Console.WriteLine("lambda");
//文字列の分割からの整数型配列の宣言と初期化
int[] num_lambda = str.Split(',').Select(s => int.Parse(s)).ToArray();
//整数型配列の各要素の出力
foreach(int j in num_lambda) {
Console.WriteLine(j);
}
}
}
####実行結果
for-each
0
1
2
3
4
5
6
7
8
9
lambda
0
1
2
3
4
5
6
7
8
9
**「csv形式のファイルから数値を配列に格納する」**プログラムです。これはセーブデータの外部ファイルへの保存等応用の幅は広いと思います。上記の出力の部分に関してはあえて別途書きましたが、書く文字数はそれを差し引いても圧倒的な差があることがわかると思います。あとはラムダ式のほうが視線を縦に動かさずに済むのでそういった意味では可読性も高いかもしれません。自分の場合はラムダ式を用いた方が楽で何をやっているのか見やすいので使う機会が多いですね。
##さいごに
ラムダ式やクエリ式等はあくまでも楽に書くための補佐的文法でしかないので、基本的な文法でもあらゆることが代替可能ではありますが、開発の際の時間、文字数、人材等のリソースの無駄な部分がカットできる可能性がありますので、「一度しか使わない代入のためだけの関数がバグの原因っぽいけど関数作りすぎてどの辺にあったかわかりづらい」や「配列を操作するのにわざわざfor文で操作するの面倒くさい」等痒い所に手が届く仕組みがLinq
には備わっているので、ぜひリファレンスや他の記事を一読してみるのもいいかもしれません。