Listのメソッド

基本操作

val list = List(1,2,3) // 生成
val list = List.range(1,4) // 生成 List(1,2,3)
val list = List(1 to 3: _*) // 生成 List(1,2,3)

val list = List.empty // 空リストの生成

0 +: list  // 先頭に要素を追加 List(0,1,2,3)
0 :: list // 上と同じ
list :+ 4 // 最後に要素を追加 List(1,2,3,4)
list ++ List(4,5,6) // リスト同士の結合 List(1,2,3,4,5,6)
list ::: List(4,5,6) // 上と同じ

list.length // 要素の長さを得る 3
list.size // 上と同じ

list(2) // 要素の取得 3
list.apply(2) // 上と同じ

list.head // 先頭要素の取得 1
list.last // 最終要素の取得 3
list.init // 最終要素を除くリスト List(1,2)
list.tail // 先頭要素を除くリスト List(2,3)

list.max // 最大要素の取得 3
list.min // 最小要素の取得 1

List(1,2,3,4,5).sum // 要素の合計 15 (1+2+3+4+5)
List(1,2,3,4,5).product // 要素の積 120 (1*2*3*4*5)

list.isEmpty // 要素が空かどうか false
list.nonEmpty // 要素が空でないかどうか true

list.contains(2) // 含むかどうか true

list.indexOf(2) // 要素2が何番目にあるか 1
List(1,2,3,2,1).lastIndexOf(2) // 要素2が最後から数えて何番目にあるか 3

List(2,1,5,4,3).sorted // 並び替え List(1,2,3,4,5)
list.reverse // 逆順で並び替え List(3,2,1)

List(1,2,2,5,4,5).distinct // 重複を除く List(1,2,5,4)

List(1,2,3,4,5,6).slice(2,4) // 部分リストの取得 List(3,4)
List(1,2,3,4).splitAt(2) // 添字2で分割しタプルを返す (List(1,2), List(3,4)

List(1,2,3,4,5).mkString(":") // 連結 "1:2:3:4:5"

より高度な操作

// 関数実行結果がtrueな最初の要素を得る Some(3)
List(1,2,3,4,5).find(_ > 2) 

// 関数実行結果がtrueなもののみフィルタ
List(1,2,3,4,5,6).filter(_ % 2 == 0) // List(2,4,6)
// 関数実行結果がfalseなもののみフィルタ
List(1,2,3,4,5,6).filterNot(_ % 2 == 0) // List(1,3,5)

// 全要素への関数適用(2倍)
List(1,2,3,4).map(_ * 2) // List(2,4,6,8)

// filterとmapの組み合わせ List(4,8)
List(1,2,3,4).collect {
  case x if (x % 2 == 0) => x * 2
}

// 要素に対して関数を適用し返ってきたコレクションを連結する
List(1,2,3,4).flatMap(1 to _) // List(1,1,2,1,2,3,1,2,3,4)

// 先頭2要素のみ取り出したリストを返す
List(1,2,3,4,5).take(2) // List(1,2)
// 後方2要素のみ取り出したリストを返す
List(1,2,3,4,5).takeRight(2) // List(4,5)
// 先頭2要素を除いたリストを返す
List(1,2,3,4,5).drop(2) // List(3,4,5)
// 後方2要素を除いたリストを返す
List(1,2,3,4,5).dropRight(2) // List(1,2,3)

// 要素ごとに関数を適用しresultに格納
List(1,2,3,4).reduceLeft((result,a) => result + a) // 10 (1+2+3+4)
// reduceLeftのresultに初期値を与える
List(1,2,3,4).foldLeft(10)((result,a) => result + a) // 20 (10+1+2+3+4)
// foldLeftの演算途中結果のコレクションを返す
List(1,2,3,4).scanLeft(10)((result,a) => result + a) // List(10, 11, 13, 16, 20)

// 関数適用してtrueなものがあるかどうか
List(1,2,3,4,5).exists(_ > 4) // true
// 全要素が関数実行結果がtrueかどうか
List(1,2,3,4,5).forall(_ > 0) // true

//  要素に対する関数実行のtrue/falseで分けたタプルを返す
List(1,2,3,4,5).partition(_ > 2) // (List(3,4,5), List(1,2))

// 2ずつ移動したListのIteratorを返す
for(x <- List(1,2,3,4,5).grouped(2)) println(x)
// List(1,2)
// List(3,4)
// List(5)

// 2ずつ移動したListのIteratorを返す
for(x <- List(1,2,3,4,5).sliding(2)) println(x)
// List(1,2)
// List(2,3)
// List(3,4)
// List(4,5)

// 戻り値をキーにMapを生成 Map(even->List(2,4,6), odd->List(1,3,5)
List(1,2,3,4,5,6).groupBy {
  case x if (x % 2 == 0) => "even"
  case _ => "odd"
}