Scala中的yield用法

Scala中的yield的主要做用是记住每次迭代中的有关值,并逐一存入到一个数组中。
用法以下:
for {子句} yield {变量或表达式}
具体举例以下,该例子获取文本文件中包含指定关键字的相关行,并统计各相关行字数,先把文本文件内容贴出来:
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个字。


注意点:java



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
14
数组