for文ではなくfor式と呼びます。
リストの中にさらにリストを持っている変数を定義し、
for式でループさせて値を出力するプログラムを書いてみようと思います。
val aaa = List("aaa", "bbb", "ccc")
val bbb = List("aaa2", "bbb2", "ccc2", "ddd2", "eeee2")
val ccc = List("aaa3", "bbb3", "ccc3", "ddd3")
val list = List(aaa,bbb,ccc)
for (
str <- list // listから子のリストを取り出し、strに格納する
if (str.length < 5); // 要素が5未満のリストに絞るフィルター
value <- str // 子のリストからString値を順番に取得してvalueに格納
) println(str.length + " : " + value)
上記プログラムで、for式の括弧の中に
if文が書いてありますが、
これを「フィルター」と呼びます。子リストの要素が5未満、つまり、この例ではbbbが処理対象からフィルタリングされて外れます。
javaだとfor文の本文にif 文を書き、不要な値のフィルタリングをします。
Scalaでも同様の記法が可能ですが、コップ本にはフィルターによる処理が紹介されています。
結果は以下になります
3 : aaa
3 : bbb
3 : ccc
4 : aaa3
4 : bbb3
4 : ccc3
4 : ddd3
想定通り、List変数bbbの中身はフィルタリングされ、出力されませんでした。
●その他の記法1
添字で配列にアクセスしたいなどの場合、以下の記法が使えます。
for (i <- 1 to 5) // 1から5まで
println("i = " + i)
表示は以下になります。
i = 1
i = 2
i = 3
i = 4
i = 5
ちなみに1 to 5 ですが、コンソールから「1 to 5」と入力すると以下になります。
scala> 1 to 5
res1: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)
1 to 5を呼ぶことでRangeオブジェクトが生成されます。for文の構文のように考えず、
オブジェクトの新しい生成法と考えると良さそうです。
最終更新:2013年10月06日 10:19