takafumi blog

日々の勉強メモ

Scala リスト / List

環境   Scala 2.11.6 CentOS7.0

Scalaスケーラブルプログラミング」(コップ本)メモ

読了:第04章まで

■ リスト / List

Scalaのリストは

  • インデックスは0から始まる
  • 常にイミュータブル。初期化時以外は要素を変更できない。  ※値の追加、や連結は常に新しいリストを生成し、それを返却している事に注意。
  • 順序が存在する。
  • 配列要素の型は決まっている

である。

▽初期化
scala> val list1 = List(1,2,3)
list1: List[Int] = List(1, 2, 3)

// 空リストはNil
scala> val list2 = List()
list2: List[Nothing] = List()
scala> list2 == Nil
res1: Boolean = true

// 値の珠つなぎでの初期化
scala> val list3 = 4::5::6::Nil
list2: List[Int] = List(4, 5, 6)
▽値の設定
// リストはイミュータブルなので、初期化時以外は要素を変更できない。
scala> list1(0) = 2
<console>:9: error: value update is not a member of List[Int]
              list1(0) = 2
▽値の取得
scala> list1(1)
res1: Int = 2

// 存在しないインデックスはエラー
scala> list1(3)
java.lang.IndexOutOfBoundsException: 3
  at scala.collection.LinearSeqOptimized$class.apply(LinearSeqOptimized.scala:65)
  at scala.collection.immutable.List.apply(List.scala:84)
  ... 33 elided
▽値の追加
// リストの先頭に要素を追加した、新しいリストを作成
scala> 0::list1
res1: List[Int] = List(0, 1, 2, 3)

// 椅子との末尾に要素を追加した、新しいリストを作成
scala> list1:+ 4
res3: List[Int] = List(1, 2, 3, 4)

※末尾への追加は推奨されない。  なぜなら、末尾に追加するには、リストを先頭から末尾まで全て辿る必要があるために非常に遅いため。

▽リストの連結
// 2つのリストを連結した、新しいリストを作成
scala> list1 ::: list3
res5: List[Int] = List(1, 2, 3, 4, 5, 6)

takafumi-s.hatenablog.com