List

ScalaのコレクションフレームワークにおけるListは、不変(immutable)な線形データ構造であり、最も基本的かつ広く使用されるコレクションの一つです。以下に、Listの特徴、使い方、操作メソッドについて詳しく説明します。


Listの基本的な特徴

  • 不変性(immutability): Scalaの標準Listは変更不可能です。一度作成されたListの内容を直接変更することはできません。要素を追加・削除する操作は、新しいListを返す形で行われます。

  • 線形構造: Listは連結リスト(linked list)として実装されています。各要素は先頭(head)と残りのリスト(tail)という形で表されます。

  • 先頭要素の取得と追加が高速: 先頭へのアクセスや追加は定数時間(O(1))で行えますが、末尾へのアクセスや追加はリストをすべて辿る必要があるため、線形時間(O(n))がかかります。


Listの生成

scala
val list1 = List(1, 2, 3, 4, 5) // 整数のList val list2 = List("apple", "banana") // 文字列のList val emptyList = List.empty[Int] // 空のList(型指定あり)

基本操作

操作 説明
head 先頭要素を取得 list1.head1
tail 先頭以外の要素を取得(リスト) list1.tailList(2, 3, 4, 5)
isEmpty 空かどうかの判定 emptyList.isEmptytrue
length 要素数の取得 list1.length5

要素の追加と連結

scala
val list1 = List(2, 3) val newList = 1 :: list1 // :: はcons演算子(先頭に追加) val combined = list1 ::: List(4) // ::: はリストの連結

高階関数の利用

ScalaのListは関数型スタイルの操作をサポートしており、以下のような高階関数が用意されています。

メソッド 説明
map 各要素に関数を適用した新しいリストを返す
filter 条件を満たす要素のみ抽出
foldLeft / foldRight 初期値と関数を使って要素を畳み込む
flatMap 各要素をリストに変換して平坦化
scala
val numbers = List(1, 2, 3) val doubled = numbers.map(_ * 2) // List(2, 4, 6) val evens = numbers.filter(_ % 2 == 0) // List(2) val sum = numbers.foldLeft(0)(_ + _) // 6

ListとArrayの違い

特性 List Array
可変性 不変 可変(または不変)
実装 連結リスト 配列
パフォーマンス 先頭の操作が高速 任意のインデックスへのアクセスが高速

使用上の注意

  • 順次処理やパターンマッチングに適しており、再帰との相性が良い

  • 要素数が多い場合、末尾要素へのアクセスコストに注意(ListではO(n))。


まとめ

ScalaのListは、イミュータブルで関数型指向に適した線形コレクションです。豊富な高階関数により、宣言的かつ直感的なデータ処理が可能です。ただし、用途によってはVectorArrayの方が性能面で優れる場合もあるため、必要に応じて適切なコレクションを選択することが重要です。

生成日:2025/05/04