ラムダ式 らむだしき
簡単に言うとこんな感じ!
「名前のない使い捨て関数」だよ!ふつう関数って名前をつけて登録してから使うんだけど、ラムダ式は「その場でサッと書いてすぐ使える関数のメモ書き」みたいなイメージ。料理で言うと、レシピに名前をつけてファイリングする代わりに、付箋にサラッと書いてその場で使い捨てる感じ!
ラムダ式とは
ラムダ式(Lambda Expression) とは、名前をつけずにその場で定義できる「無名関数」のことです。通常、プログラムで処理を再利用するときは function calcTax() { ... } のように名前付きで関数を定義しますが、ラムダ式を使うと名前なしで関数を値として直接書けます。「関数を変数に入れたり、別の関数の引数として渡したりできる」という考え方が背景にあります。
ラムダ式という名前は、数学のラムダ計算(λ計算) に由来します。1930年代にアロンゾ・チャーチが考案した、関数を数学的に記述するための体系で、現代のプログラミング言語の理論的な土台のひとつです。「λ」という記号が関数の定義を表していたことから、プログラミングでも同じ概念に「ラムダ式」という名が使われています。
現在はJava、Python、JavaScript、C#、Kotlinなど主要な言語のほぼすべてがラムダ式をサポートしており、コードを短く・読みやすくするための重要な文法機能として広く使われています。特にリストの並び替え・フィルタリング・変換といった処理を一行で書けるため、データ処理のコードで頻繁に登場します。
ラムダ式の構造と書き方
ラムダ式は「引数」と「処理内容(式・本体)」だけで構成されたシンプルな関数です。
| 要素 | 説明 | 例(Python) |
|---|---|---|
| 引数 | 受け取る値 | x |
| 処理(本体) | 引数に対して行う計算や変換 | x * 2 |
| ラムダ式全体 | 名前なしの関数として扱える | lambda x: x * 2 |
主要な言語での書き方の比較:
【名前付き関数(従来の書き方)】
Python: def double(x): return x * 2
Java: int double(int x) { return x * 2; }
JS: function double(x) { return x * 2; }
【ラムダ式(無名関数)】
Python: lambda x: x * 2
Java: x -> x * 2
JS: x => x * 2
C#: x => x * 2
Kotlin: { x: Int -> x * 2 }
語呂合わせで覚える「ラムダ式の3点セット」
「な・ひ・す」
- なまえがない(無名関数)
- ひき数を受け取る(引数)
- すぐ返す(式を直接返す)
「名前なし・引数あり・すぐ返す」の3点がラムダ式の基本形です!
主な使いどころ
| シーン | 説明 | コード例(Python) |
|---|---|---|
| リストの並び替え | 並び順のルールをその場で指定 | sorted(items, key=lambda x: x.price) |
| フィルタリング | 条件に合う要素だけ抽出 | filter(lambda x: x > 0, nums) |
| 変換(map) | 各要素に処理を適用 | map(lambda x: x * 2, nums) |
| コールバック | ボタンクリック時の処理など | btn.on_click(lambda e: print("clicked")) |
歴史と背景
- 1936年 — 数学者アロンゾ・チャーチがλ計算(ラムダ計算) を発表。関数を記号で表す数学理論を確立
- 1958年 — Lisp が登場。ラムダ計算の考え方をプログラミング言語に初めて取り込み、
(lambda (x) (* x 2))のような構文を実現 - 1980〜90年代 — 関数型言語(HaskellやML)がラムダ式を積極的に採用。学術的な言語では主流に
- 2005年前後 — Python 2.x がすでにラムダ式を持っていたが、シンプルさ優先でリスト内包表記も普及
- 2011年 — Java 8 (2014年リリース) の設計が本格化。エンタープライズ向け言語にもラムダ式が求められるようになる
- 2014年 — Java 8 リリース。
->構文のラムダ式が正式導入。ビジネス現場での普及が爆発的に加速 - 2015年 — ECMAScript 2015(ES6) でJavaScriptに
=>のアロー関数が追加。Web開発者にも一気に広まる - 現在 — モダンな言語・フレームワークではラムダ式は「あたりまえの文法」として定着
関連する概念との比較
ラムダ式は「関数型プログラミング」の概念群と密接に関わっています。セットで理解すると使いこなしやすくなります。
「ラムダ式」vs「名前付き関数」どう使い分ける?
| 状況 | 推奨 | 理由 |
|---|---|---|
| 同じ処理を複数箇所で使う | 名前付き関数 | 再利用・テストがしやすい |
| 一度しか使わない短い処理 | ラムダ式 | コードが短くなる・読みやすい |
| 複数行の複雑なロジック | 名前付き関数 | ラムダ式は1式が基本のため |
| 並び替えや変換のルール指定 | ラムダ式 | sorted()・map() などとの相性が良い |
| デバッグ・ログ追加が必要 | 名前付き関数 | 無名だとスタックトレースが読みにくい |
関連用語
- ./025-function.md — 関数 — 処理に名前をつけて再利用できるようにしたコードのまとまり
- ./026-higher-order-function.md — 高階関数 — 関数を引数に受け取ったり戻り値として返したりできる関数
- ./027-closure.md — クロージャ — 定義された時点の外側の変数を記憶する関数
- ./029-functional-programming.md — 関数型プログラミング — 関数を値として扱い、状態変化を避ける設計パラダイム
- ./030-arrow-function.md — アロー関数 — JavaScriptにおける
=>を使ったラムダ式の構文 - ./031-callback.md — コールバック関数 — 処理の完了後や特定イベント時に呼び出される関数
- ./032-immutable.md — イミュータブル — 作成後に値を変更しない設計原則。関数型プログラミングの中核概念