プログラミング基礎概念

ラムダ式 らむだしき

無名関数関数型プログラミングクロージャアロー関数高階関数関数オブジェクト
ラムダ式について教えて

簡単に言うとこんな感じ!

「名前のない使い捨て関数」だよ!ふつう関数って名前をつけて登録してから使うんだけど、ラムダ式は「その場でサッと書いてすぐ使える関数のメモ書き」みたいなイメージ。料理で言うと、レシピに名前をつけてファイリングする代わりに、付箋にサラッと書いてその場で使い捨てる感じ!


ラムダ式とは

ラムダ式(Lambda Expression) とは、名前をつけずにその場で定義できる「無名関数」のことです。通常、プログラムで処理を再利用するときは function calcTax() { ... } のように名前付きで関数を定義しますが、ラムダ式を使うと名前なしで関数を値として直接書けます。「関数を変数に入れたり、別の関数の引数として渡したりできる」という考え方が背景にあります。

ラムダ式という名前は、数学のラムダ計算(λ計算) に由来します。1930年代にアロンゾ・チャーチが考案した、関数を数学的に記述するための体系で、現代のプログラミング言語の理論的な土台のひとつです。「λ」という記号が関数の定義を表していたことから、プログラミングでも同じ概念に「ラムダ式」という名が使われています。

現在はJavaPythonJavaScriptC#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開発者にも一気に広まる
  • 現在 — モダンな言語・フレームワークではラムダ式は「あたりまえの文法」として定着

関連する概念との比較

ラムダ式は「関数型プログラミング」の概念群と密接に関わっています。セットで理解すると使いこなしやすくなります。

ラムダ式と関連概念のマップ ラムダ式 (無名関数) 高階関数 関数を引数に取る関数 クロージャ 外の変数を記憶する関数 関数型プログラミング 関数を値として扱う考え方 map / filter 高階関数の代表例 アロー関数 JSにおけるラムダ式構文 イミュータブル 状態を変えない設計原則

「ラムダ式」vs「名前付き関数」どう使い分ける?

状況推奨理由
同じ処理を複数箇所で使う名前付き関数再利用・テストがしやすい
一度しか使わない短い処理ラムダ式コードが短くなる・読みやすい
複数行の複雑なロジック名前付き関数ラムダ式は1式が基本のため
並び替えや変換のルール指定ラムダ式sorted()map() などとの相性が良い
デバッグ・ログ追加が必要名前付き関数無名だとスタックトレースが読みにくい

関連用語