Scala学习笔记(8)-内建控制结构

for表达式,可以看下面的代码自己理会,不难。

val filesHere = (new java.io.File(".")).listFiles
for (file <- filesHere) println(file)

for表达式语法对任何种类的集合类都有效,更精确地说,在<-符号右侧的表达式必须支持名为foreach的方法。

过滤器:有些时候你不想枚举一个集合类的全部元素。而是想过滤出一个子集。你可以通过把过滤器:filter:一个if子句加到for的括号里做到。

val filesHere = (new java.io.File(".")).listFiles
for (file <- filesHere
    if file.isFile;
    if file.getName.endsWith(".scala")) //多个过滤器用;分隔
    println(file)

嵌套枚举

def fileLines(file: java.io.File) = scala.io.Source.fromFile(file).getLines.toList
def grep(pattern: String) =
for { file <- filesHere
    if file.getName.endsWith(".scala")
    line <- fileLines(file)
    if line.trim.matches(pattern)
}
println(file + ": " + line.trim)
grep(".*gcd.*")

如果愿意的话,你可以使用大括号代替小括号环绕发生器和过滤器。使用大括号的一个好处是你可以省略一些使用小括号必须加的分号。

制造新集合-yield关键字

只要在for表达式之前加上关键字yield,就可以创建一个值去记住每一次的迭代。

for-yield表达式的语法是这样的: for {子句} yield {循环体}        //注意yield关键字的位置

异常处理模块用到了Scala的模式匹配

try {
    val f = new FileReader("input.txt") // Use and close file
} catch {
    case ex: FileNotFoundException => // Handle missing file
    case ex: IOException => // Handle other I/O error
}

match表达式

val firstArg = if (args.length > 0) args(0) else ""
val friend =firstArg match {   //有返回值
    case "salt" => "pepper"     //任何类型的常量都可做匹配,break是隐含的。
    case "eggs" => "bacon"
    case _ => "huh"   //缺省情况用下划线占位符(_)说明
}

你可能感兴趣的:(Scala学习笔记(8)-内建控制结构)