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 |