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