scala内建控制结构
内建控制结构
scala的控制结构都会产生某个值。这是函数式语言所采用的方式,程序被看成是计算值的活动,因此程序的控件也应当这么做
if表达式
scala的if是能返回值的表达式
val是函数式的风格
val更好的支持等效推论
在表达式没有副作用的前提下,引入的变量等效于计算它的表达式,因此可以用表达式替代变量名
while循环
while和do-while结构被称为“循环”,不是表达式,因为它们不产生有意义的结果,结果的类型是unit
说明产生的值的类型为unit,写做()。()的存在是scala的unit不同于java的void的地方
for表达式
枚举集合类
val filesHere = (new java.io.File(".")).listFiles
for(file<-filesHere)
println(file)
过滤
如果你想过滤出一个子集,可以通过过滤器:filter:一个if子句加到for的括号里做到
val filesHere = (new java.io.File(".")).listFiles
for(file<-fileshere 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.*")
可以使用大括号代替小括号环绕发生器和过滤器,好处是可以省略一些使用小括号必须加的分号
mid-stream(流间)变量绑定
通过用等号(=)把结果绑定到新变量可以做到这点,绑定的变量被当作val引入和使用,不过不用带关键字val
制造新集合
可以创建一个值去记住每一次的迭代,只要在for表达式之前加上关键字yield
def scalaFiles =
for {
file <- filesHere
if file.getName.endsWith(".scala")
} yield file
使用try表达式处理异常
抛出异常
throw new IllegalArgumentException
throw也是有结果类型的表达式
val half =
if (n % 2 == 0)
n / 2
else
throw new RuntimeException("n must be even")
把抛出的异常当作任何类型的值都是安全的
捕获异常
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
}
finally子句
无论如何都要执行的语句
生成值
try-catch-finally也产生值
def urlFor(path: String) =
try {
new URL(path)
} catch {
case e: MalformedURLException => new URL("http://www.scalalang.org")
}
match表达式
match表达式可以让你使用任意的模式做选择
val firstArg = if (args.length > 0) args(0) else ""
firstArg match {
case "salt" => println("pepper")
case "chips" => println("salsa")
case "eggs" => println("bacon")
case _ => println("huh?")
}
离开break和continue
函数式风格劲量不要用
变量范围
和java一样

浙公网安备 33010602011771号