ScalaのコレクションフレームワークにおけるListは、不変(immutable)な線形データ構造であり、最も基本的かつ広く使用されるコレクションの一つです。以下に、Listの特徴、使い方、操作メソッドについて詳しく説明します。
Listの基本的な特徴
-
不変性(immutability): Scalaの標準
Listは変更不可能です。一度作成されたListの内容を直接変更することはできません。要素を追加・削除する操作は、新しいListを返す形で行われます。 -
線形構造:
Listは連結リスト(linked list)として実装されています。各要素は先頭(head)と残りのリスト(tail)という形で表されます。 -
先頭要素の取得と追加が高速: 先頭へのアクセスや追加は定数時間(O(1))で行えますが、末尾へのアクセスや追加はリストをすべて辿る必要があるため、線形時間(O(n))がかかります。
Listの生成
基本操作
| 操作 | 説明 | 例 |
|---|---|---|
head |
先頭要素を取得 | list1.head → 1 |
tail |
先頭以外の要素を取得(リスト) | list1.tail → List(2, 3, 4, 5) |
isEmpty |
空かどうかの判定 | emptyList.isEmpty → true |
length |
要素数の取得 | list1.length → 5 |
要素の追加と連結
高階関数の利用
ScalaのListは関数型スタイルの操作をサポートしており、以下のような高階関数が用意されています。
| メソッド | 説明 |
|---|---|
map |
各要素に関数を適用した新しいリストを返す |
filter |
条件を満たす要素のみ抽出 |
foldLeft / foldRight |
初期値と関数を使って要素を畳み込む |
flatMap |
各要素をリストに変換して平坦化 |
ListとArrayの違い
| 特性 | List | Array |
|---|---|---|
| 可変性 | 不変 | 可変(または不変) |
| 実装 | 連結リスト | 配列 |
| パフォーマンス | 先頭の操作が高速 | 任意のインデックスへのアクセスが高速 |
使用上の注意
-
順次処理やパターンマッチングに適しており、再帰との相性が良い。
-
要素数が多い場合、末尾要素へのアクセスコストに注意(
ListではO(n))。
まとめ
ScalaのListは、イミュータブルで関数型指向に適した線形コレクションです。豊富な高階関数により、宣言的かつ直感的なデータ処理が可能です。ただし、用途によってはVectorやArrayの方が性能面で優れる場合もあるため、必要に応じて適切なコレクションを選択することが重要です。
生成日:2025/05/04