今日はリストの高階関数を中心に見ていこう。
foldLeftとfoldRight
まずは畳み込み関数。foldLeft は左から、foldRight は右から畳み込む。
scala> List(1,2,3,4,5).foldLeft("0")((x, y) => List(x, y).mkString("(", ",", ")")) res0: String = (((((0,1),2),3),4),5)
scala> List(1,2,3,4,5).foldRight("0")((x, y) => List(x, y).mkString("(", ",", ")")) res1: String = (1,(2,(3,(4,(5,0)))))
畳み込みの初期値と関数が別の引数リストになってる。何のためだろ。
map
map は写像。
scala> List(1,2,3,4,5).map(x => x * x) res2: List[Int] = List(1, 4, 9, 16, 25)
fileter
条件に合う要素だけを抜き出す。
scala> List(1,2,3,4,5).filter(x => x % 2 == 1) res3: List[Int] = List(1, 3, 5)
find
条件に合う最初の要素を返す。
scala> List(1,2,3,4,5).find(x => x % 2 == 0) res4: Option[Int] = Some(2)
Option[Int] って型と Some(2) って値が返ってきた。OCaml でいう Option 型かな。Haskell だと Maybe。
takeWhile
リストの先頭から条件に合っている間だけ抽出する。
scala> List(1,2,3,4,5).takeWhile(x => x < 3) res5: List[Int] = List(1, 2)
count
条件に合う要素を数える。
scala> List(1,2,3,4,5).count(x => x % 2 == 0) res6: Int = 2