コレクション操作(map, filter, reduce など)

Scalaのコレクションフレームワークにおけるコレクション操作(map, filter, reduce など)は、関数型プログラミングの考え方を活かした非常に強力な機能です。これらの操作は主に不変(immutable)コレクションに対して使われ、既存のコレクションを変更せずに、新しいコレクションを返します。以下、それぞれの代表的な操作について詳しく説明します。


1. map

説明:

各要素に関数を適用し、その結果を含む新しいコレクションを生成します。

シグネチャ(簡略化):

scala
def map[B](f: A => B): List[B]

例:

scala
val numbers = List(1, 2, 3) val doubled = numbers.map(_ * 2) // List(2, 4, 6)

2. filter

説明:

指定した条件(述語)を満たす要素だけを取り出して、新しいコレクションを生成します。

シグネチャ:

scala
def filter(p: A => Boolean): List[A]

例:

scala
val numbers = List(1, 2, 3, 4, 5) val even = numbers.filter(_ % 2 == 0) // List(2, 4)

3. reduce / reduceLeft / reduceRight

説明:

コレクション内の要素を1つに畳み込む(集約する)操作です。演算子は結合的である必要があります(たとえば加算や乗算)。

シグネチャ(reduce):

scala
def reduce[B >: A](op: (B, B) => B): B

例:

scala
val numbers = List(1, 2, 3, 4) val sum = numbers.reduce(_ + _) // 10

4. fold / foldLeft / foldRight

説明:

reduce に似ていますが、初期値を指定できるのが特徴です。foldLeft は左から、foldRight は右から処理します。

例:

scala
val numbers = List(1, 2, 3) val sum = numbers.foldLeft(0)(_ + _) // 6

5. flatMap

説明:

map の後に flatten(平坦化)を行う操作です。各要素をリストに変換し、それらを結合して1つのリストにします。

例:

scala
val words = List("hello", "world") val chars = words.flatMap(_.toList) // List(h, e, l, l, o, w, o, r, l, d)

6. foreach

説明:

各要素に対して副作用のある操作を行いますが、結果は返しません(例えばログ出力などに使用)。

例:

scala
List(1, 2, 3).foreach(println)

7. zip

説明:

2つのコレクションを対応する要素ごとにペアにして、新しいコレクションを作成します。

例:

scala
val a = List(1, 2, 3) val b = List("a", "b", "c") val zipped = a.zip(b) // List((1,"a"), (2,"b"), (3,"c"))

8. partition

説明:

ある条件でコレクションを2つに分割します。条件を満たす要素と満たさない要素に分けてタプルで返します。

例:

scala
val numbers = List(1, 2, 3, 4, 5) val (even, odd) = numbers.partition(_ % 2 == 0) // even: List(2, 4), odd: List(1, 3, 5)

まとめ

操作 用途
map 各要素に関数を適用
filter 条件を満たす要素だけを抽出
reduce 要素を畳み込んで1つに集約
fold 初期値を含めて畳み込む
flatMap 要素を展開して結合
foreach 各要素に副作用のある操作
zip 2つのリストをペアにする
partition 条件で2つのグループに分割

これらの操作を組み合わせることで、Scalaでは簡潔かつ安全にデータ変換・処理を行うことが可能になります。

生成日:2025/05/04