if, try, for, match
if
1 if控制结构可以产生值,三元操作符的行为与if一致,也被称为if, while和do...while控制结构不能产生值,结果类型是Unit,尽量减少使用while
2 因为if可以返回值,代码可以如下优化
var filename = "hellokitty"
if(!args.isEmpty)
filename = "byekitty"
val filename =
if(!args.isEmpty) "hellokitty"
else "byekitty"
3 对于结果类型是Unit的方法,返回值被称为unit value,写作(),将方法执行结果与()相比总为true
for
1 generator语法
val fileList = (new java.io.File(".")).listFiles // 当前目录包含的目录和文件,返回数组
for(file <- fileList) // 每一次循环,新的val类型file都被初始化,file可以通过类型推断知道是File类型
println(file)
file <- fileList被称为generator语法
2 until不包含上边界
to包含上边界
3 for表达式中添加filter,使用if子句过滤条件,子句使用;隔开
for(file <- fileList if file.getName.endsWith(".scala"); if file.isFile)
println(file)//只输出.scala且是文件的file
4 mid-stream变量绑定和嵌套枚举
def grep(pattern : String) =
for{ //花括号 且多个<-形成嵌套枚举
file <- filesHere
if file.getName.endsWith(".Scala")
line <- fileLines(file)
trimmed = line.trim //变量绑定
if trimmed.matches(pattern)
} println(file + ": " + trimmed)
如果for表达式由generator和filter,可以使用花括号,可以省略分号
嵌套枚举是for表达式添加了多个 <-
mid-stream变量绑定是在产生将绑定值到新变量
5 yield
for{子句} yield {循环体}
yield将每一次循环体中的结果记录下来,生成一个数组
try
1 抛出异常的类型是Nothing类型
看下面这段代码,如果n不是偶数,那在给half赋值之前,已经抛出了异常,这样做是安全的
val half =
if(n % 2 == 0)
n /2
else
throw new RuntimeException("n is not even")
2 try-catch-finally也产生值
def urlFor(path: String) =
try{
new URL(path)
} catch {
case e: MalformedURLException => new URL("http://...")
}
3 Scala中,下面这个例子返回1
def g(): Int = try{ 1 } finally { 2 }
match
number match{
case 1 => println("1")
case 2 => println("2")
case _ => println("ha?")
}
变量范围
1 范围定义与Java一致
2 可以定义同名的变量,只要不在同一范围内
val a = 1
val a = 2 //编译不通过
println(a)
val a = 1
{
val a = 2 //编译通过
println(a)
}
println(a)