Scala中的yield的主要做用是記住每次迭代中的有關值,並逐一存入到一個數組中。
用法以下:
for {子句} yield {變量或表達式}java
具體舉例以下,該例子獲取文本文件中包含指定關鍵字的相關行,並統計各相關行字數,先把文本文件內容貼出來:
I love Scala.
I love Spark.
I love Hadoop.
下面是程序代碼:數組
object YieldDemo {
lazy val files = (new java.io.File("D:\\Scala_Projects\\ScalaInAction\\src\\com\\zhangyun\\scala\\hello")).listFiles
// 輸出指定目錄下的全部文件
/*for(file <- files)
{
println(file)
}*/
def fileLines(file: java.io.File) = {
Source.fromFile(file).getLines.toList
}
def main(args: Array[String]): Unit = {
val lengths =
for {
// 獲取以.txt結尾的文件
file <- files if file.getName.endsWith(".txt")
line <- fileLines(file)
trimmedLine = line.trim
if trimmedLine.matches(".*love.*")
} yield line + ":合計" + trimmedLine.length + "個字。"
lengths.foreach(println)
}
}
先來看看輸出:
I love Scala.:合計13個字。
I love Spark.:合計13個字。
I love Hadoop.:合計14個字。oop
注意點:scala
yield最終會將每次迭代的line + ":合計" + trimmedLine.length + "個字。"結果存放到一個數組中.
在這裏是一條表達式,若是你用 trimmedLine.length 替代這條語句,則將每次迭代的trimmedLine.length值存放到數組中。
若是將yield改成:
} yield {
println(line)
trimmedLine.length
}
則在每次迭代中會打印各相關行內容。各相關行字數會存入到數組中,並經過程序最後一條代碼lineLengths.foreach(println)打印出來。
要記住,要將結果存放到數組的變量或表達式必須放在yield{}裏最後位置。結果以下:
I love Scala.
I love Spark.
I love Hadoop.
13
13
14get