1. 程式人生 > >scala學習之內建控制結構->for語句

scala學習之內建控制結構->for語句

 

scala初學者,高手勿噴 O(∩_∩)O~

For 表示式

一、列舉集合類

程式碼:

val fileHere = (new java.io.File("c:\\")).listFiles

for(file <- fileHere)
 println(file)

該語句把c盤根目錄下的所有檔案都列出來

或者也可以使用如下方法

//scala中不常見

for(i <- 0 to filesHere.length - 1)

   println(filesHere(i))

不常見的原因是:集合物件本身可以被直接列舉,這樣程式碼可以變得更短並回避了許多列舉陣列時頻繁出現的溢位越界等現象(off-by-one error)。列舉該從0還是1開始?最後的索引值應該加1還是-1,還是什麼都不加?這些問題很容易回答,但也很容易出錯。因此還是避免碰到為佳。

二、過濾

有時你並不想列舉集合的全部元素,而只是想取出某個子集。可以通過在for表示式的括號中新增if子句來實現。如下程式碼,實現了列出當前目錄中以“.scala”結尾的檔名

val fileHere = (new java.io.File(".")).listFiles

for(file <- fileHere if file.getName.endsWith(".scala"))
 println(file)

或者也可以採用如下寫法:

for(file <- filesHere)

   if(file.getName.endsWith(".scala"))

     println(file)

需要的話可以包含更多的過濾器,只需要不斷增加if子句即可。

例如,以下程式碼列印輸出檔案而不是目錄:

for(file <- filesHere

 if(file.isFile);

 if(file.getName.endsWith(".scala")

)println(file)

 注意:如果在發生器中加入超過一個過濾器,if子句必須用分號分隔

三、巢狀列舉

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 <- filesHere
 if file.getName.endsWith(".scala");//注意這兒的分號

 line <- fileLines(file)
 if line.trim.matches(pattern)
 )println(file + ": " + line.trim)
grep(".*gcd.*")