コレクションに対するmap, filter, reduce操作

関数型プログラミングにおける**map**, filter, **reduce**は、イミュータブルなコレクション(リスト、配列、セットなど)を扱ううえで非常に重要な操作であり、副作用を伴わないデータ変換処理を実現します。以下に、それぞれの操作の意味、役割、使用例、イミュータビリティとの関係を詳しく説明します。


1. map:要素ごとの変換

概要

mapは、コレクション内の各要素に対して関数を適用し、新しいコレクションを返す操作です。

特徴

  • 元のコレクションは変更されず、新しいコレクションが返される(イミュータビリティの遵守)

  • 関数は純粋関数であるべき(副作用なし)

例(疑似コード)

functional
map(x => x * 2, [1, 2, 3]) // => [2, 4, 6]

2. filter:条件による要素の抽出

概要

filterは、コレクションの各要素に対して述語関数(真偽値を返す関数)を適用し、trueの要素だけを抽出します。

特徴

  • 元のコレクションは変更されず、新しい部分集合が返される

  • 条件に一致する要素だけを保持

functional
filter(x => x % 2 == 0, [1, 2, 3, 4]) // => [2, 4]

3. reduce(fold):畳み込みによる集約

概要

reduceは、コレクションの要素を1つの値に集約する操作です。初期値と二項関数を指定して、コレクションを左から右へ畳み込みます。

特徴

  • 元のコレクションは変更されない

  • 例えば合計値や積、最大値、文字列結合などの計算に使える

functional
reduce((acc, x) => acc + x, 0, [1, 2, 3, 4]) // => 10

イミュータビリティとの関係

関数型プログラミングでは**「元のデータを変更しない」**というイミュータビリティの原則があります。
そのため、mapfilterreduceは以下のような重要な性質を持ちます。

  • 状態を変えずに値を導出するため、安全性と予測可能性が高い

  • スレッドセーフであり並列処理に適している

  • テストがしやすく、副作用がないためバグが発生しにくい


まとめ

操作 説明 返すもの 副作用 イミュータブル
map 各要素に関数を適用 変換された新コレクション なし はい
filter 条件に合う要素を抽出 部分集合の新コレクション なし はい
reduce 要素を一つに集約 単一の値 なし はい

これらの操作は、イミュータブルなデータ構造の上で宣言的に処理を記述する関数型スタイルを実現する基礎となっています。これにより、バグの少ない、安全なプログラム設計が可能になります。

生成日:2025/06/01