あるプログラマの日記

プログラマのメモ、出来事、考えたこと、勉強とかの雑記

List の使い方(続き5)

List の高階メソッド ( exists, forall, sortWith, foldLeft, foldRight )

特定の条件に合致する要素があるかを判定する

リストの要素中に条件に合致する要素があるかどうかを判断する。
要素を引数にとりBooleanを返す述語関数を引数に指定する。

  • 要素中に1つでも条件に合致するものがあるかを判定する。( exists )
scala> val list = List(2, 3, 4, 5, 6, 7, 8)
list: List[Int] = List(2, 3, 4, 5, 6, 7, 8)

scala> list exists { _ == 9 }
res0: Boolean = false

scala> list exists { _ == 5 }
res1: Boolean = true
  • すべての要素が条件に合致するかを判定する。( forall )
scala> list forall { _ < 9 }
res2: Boolean = true

scala> list forall { _ % 2 == 0 }
res3: Boolean = false

要素のソート

前後の要素 2つを引数にとり前後関係を判定して Boolean を返す関数を sortWith の引数に指定する。

scala> val list2 = List(3, 4, 2, 6, 7, 5, 1)
list2: List[Int] = List(3, 4, 2, 6, 7, 5, 1)

scala> list2 sortWith { _ < _ }
res4: List[Int] = List(1, 2, 3, 4, 5, 6, 7)

scala> list2 sortWith { _ > _ }
res5: List[Int] = List(7, 6, 5, 4, 3, 2, 1)

畳み込み

リストのすべての要素を結合する。(foldLeft, foldRight)
foldLeft と foldRight は引数リストを2つとる高階メソッド
1つ目の引数リストに結合前の初期値を指定する。
2つ目の引数リストに関数オブジェクトをとる。
関数オブジェクトは2つの引数をとり1つ目の引数リストの引数と同じ型の値を返す。
foldLeft は左の要素から順に処理する。
foldRight は右の要素から順に処理する。

scala> val list3 = List(1, 2, 3, 4, 5)
list3: List[Int] = List(1, 2, 3, 4, 5)

scala> list3.foldLeft(0)(_ + _)
res4: Int = 15

scala> list3.foldRight(0)(_ + _)
res5: Int = 15

1つ目の引数リストの引数に文字列を指定すると
畳み込みの要素と処理(+)は文字列として扱われる。

scala> list3.foldLeft("L")(_ + _)
res6: java.lang.String = L12345

scala> list3.foldRight("R")(_ + _)
res7: java.lang.String = 12345R

/: は foldLeft と同じ意味になる。メソッドの最後が ":" になるので右側にあるオブジェクトのメソッドになる。
:\ は foldRight と同じ意味のメソッド。

scala> (0 /: list3)( _ + _ )
res8: Int = 15

scala> ("L" /: list3)( _ + _ )
res9: java.lang.String = L12345

scala> (list3 :\ 0)( _ + _ )
res10: Int = 15

scala> (list3 :\ "R")( _ + _ )
res11: java.lang.String = 12345R