val filesHere = (new java.io.File(".")).listFiles
def fileLines (file : java.io.File) =
scala.io.Source.fromFile(file).getLines().toList
def grep (pattern: String) =
for (
file if file.getName.endsWith(".scala");
line <-fileLines(file)
if line.trim.matches(pattern)
) println(file + ":" + line.trim)
grep (".*gcd.*")
注意上面代碼中兩個迭代之間使用了”;”,如果你使用{} 替代 for 的()的括號,你可以不使用“;”分隔這兩個“生成器”,這是因為 Scala 編譯器不推算包含在括號內(nèi)的省掉的“;”。使用{}改寫的代碼如下:
val filesHere = (new java.io.File(".")).listFiles
def fileLines (file : java.io.File) =
scala.io.Source.fromFile(file).getLines().toList
def grep (pattern: String) =
for {
file if file.getName.endsWith(".scala")
line <-fileLines(file)
if line.trim.matches(pattern)
} println(file + ":" + line.trim)
grep (".*gcd.*")
這兩段代碼是等效的。
綁定中間變量
你可以注意到前面代碼使用了多次 line.trim,如果 trim 是個耗時的操作,你可以希望 trim 只計算一次,Scala 允許你使用=號來綁定計算結(jié)果到一個新變量。綁定的作用和 val 類似,只是不需要使用 val 關(guān)鍵字,例如,修改前面的例子,只計算一次 trim,把結(jié)果保存在 trimmed 變量中。
val filesHere = (new java.io.File(".")).listFiles
def fileLines (file : java.io.File) =
scala.io.Source.fromFile(file).getLines().toList
def grep (pattern: String) =
for {
file if file.getName.endsWith(".scala")
line <-fileLines(file)
trimmed=line.trim
if trimmed.matches(pattern)
} println(file + ":" + trimmed)
grep (".*gcd.*")
生成新集合
for 表達式也可以用來生產(chǎn)新的集合,這是 Scala 的 for 表達式比 Java 的 for 語句功能強大的地方。它的基本語法如下:
for clauses yield body
關(guān)鍵字 yield 放在 body 的前面,for 沒迭代一次,產(chǎn)生一個 body,yield 收集所有的 body 結(jié)果,返回一個 body 類型的集合。比如,前面列出所有 .scala 文件,返回這些文件的集合:
def scalaFiles =
for {
file if file.getName.endsWith(".scala")
} yield file
更多建議: