標籤:

Scala中的yield

Scala中的yield不像Ruby里的yield,Ruby里的yield象是個佔位符。Scala中的yield的主要作用是記住每次迭代中的有關值,並逐一存入到一個數組中。用法如下:

for {子句} yield {變數或表達式}n

具體舉例如下,該例子獲取文本文件中包含指定關鍵字的相關行,並統計各相關行字數,先把文本文件內容貼出來:

I like Scala.nHah Hah, Well!nNice Scala-lang! Right? Are u ready?nLets go...太棒咯~n非常好!ScalanScala特棒!n我們一起來玩函數式編程吧!n開心就好哈!n

下面是程序代碼:

/*n* Scala yield用法n* 作者:2guan* 2014/05/12n*/nnobject YieldDemo {n private val files = (new java.io.File(".")).listFilesnn private def fileLines(file: java.io.File) =n scala.io.Source.fromFile(file).getLines.toListnn def main(args: Array[String]): Unit = {n val lineLengths =n for {n file <- filesn if file.getName.endsWith(".txt")nn line <- fileLines(file)n trimmedLine = line.trimn if trimmedLine.matches(".*棒.*")n } yield line + ":合計" + trimmedLine.length + "個字。"nn lineLengths.foreach(println)n }n}n

先來看看輸出:

Lets go...太棒咯~:合計15個字。nScala特棒!:合計8個字。n[Finished in 3.2s]n

注意點:

  • yield最終會將每次迭代的line + ":合計" + trimmedLine.length + "個字。"結果存放到一個數組中,在這裡是一條表達式,如果你用trimmedLine.length替代這條語句,則將每次迭代的trimmedLine.length值存放到數組中。

  • 如果將yield改為:

} yield {n println(line)n trimmedLine.lengthn }n

則在每次迭代中會列印各相關行內容。各相關行字數會存入到數組中,並通過程序最後一條代碼lineLengths.foreach(println)列印出來。要記住,要將結果存放到數組的變數或表達式必須放在yield{}里最後位置。結果如下:

Lets go...太棒咯~nScala特棒!n15n8n[Finished in 2.6s]n


推薦閱讀:

scala 和 haskell哪個更適合 新人去學習?
Scala快速入門-9-高階函數
#Scala#一個函數的分析,以及生活路上
如何評價 scala native?
scala case class 這時候該怎麼用?

TAG:Scala |