Scala--yield的使用方法

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

相關文章
相關標籤/搜索