1 条件表达式
Scala中的 if else 语句和java中的一样,不过Scala中的if else有值,这个值就是跟在if else后面的值
object ScalaActivi extends App{
val x = 10
val s = if (x > 0) 1 else -1
println(s)
}
上面语句的val s = if (x > 0) 1 else -1
等同于 if (x > 0) s = 1 else s = -1
第一种写法是优于第二种写法的,因为第一种写法可以用来初始化一个val
,而第二种写法必须是var
在Scala中,每个表达式都有一个类型,混合类型表达式比如:
val s1: Any = if (x > 0) "正" else -1
类型是Any类型,这是因为其中一个分支是java.lang.String,而另一个分支是Int类型,他们的公共超类型叫Any
2 块表达式
在Scala
中,{}
包含一系列的表达式,其结果也是一个表达式,块中最后一个表达式的结果就是块的值
private val d: Double = {
val dx = x - x0;
val dy = y - y0;
scala.math.sqrt(dx * dx + dy * dy)
}
表达式的值scala.math.sqrt(dx * dx + dy * dy)
就是块的值
赋值动作本身没有值,或者说它们的值是Unit类型,如果块中的最后一个表达式没有返回值,则块的返回值是 Unit 类型。
scala> val result ={ val a = 1 + 1; val b = 2 + 2 }
result: Unit = ()
3 循环表达式
3.1 while循环
Scala 语言中 while 循环的语法:
while(condition)
{
statement(s);
}
在这里,statement(s)
可以是一个单独的语句,也可以是几个语句组成的代码块。
condition
可以是任意的表达式,当为任意非零值时都为 true。当条件为 true 时执行循环。 当条件为 false 时,退出循环,程序流将继续执行紧接着循环的下一条语句。
// 局部变量
var a = 10;
// while 循环执行
while( a < 20 ){
println( "Value of a: " + a );
a = a + 1;
}
Value of a: 10
Value of a: 11
Value of a: 12
Value of a: 13
Value of a: 14
Value of a: 15
Value of a: 16
Value of a: 17
Value of a: 18
Value of a: 19
3.2 do…while循环
不像 while 循环在循环头部测试循环条件, Scala 语言中,do…while 循环是在循环的尾部检查它的条件。
do…while 循环与 while 循环类似,但是 do…while 循环会确保至少执行一次循环。
do {
statement(s);
} while( condition );
条件表达式出现在循环的尾部,所以循环中的 statement(s) 会在条件被测试之前至少执行一次。如果条件为 true,控制流会跳转回上面的 do,然后重新执行循环中的 statement(s)。这个过程会不断重复,直到给定条件变为 false 为止。
do{
println( "Value of a: " + a );
a = a + 1;
}while( a < 20 )
输出结果为
Value of a: 10
Value of a: 11
Value of a: 12
Value of a: 13
Value of a: 14
Value of a: 15
Value of a: 16
Value of a: 17
Value of a: 18
Value of a: 19
3.3 for循环
for
循环的基本使用
object ScalaApp extends App {
// 1.基本使用 输出[1,9)
for (n <- 1 until 10) {print(n)}
// 2.使用多个表达式生成器 输出: 11 12 13 21 22 23 31 32 33
for (i <- 1 to 3; j <- 1 to 3) print((10 * i + j)+" ")
// 3.使用带条件的表达式生成器 输出: 12 13 21 23 31 32
for (i <- 1 to 3; j <- 1 to 3 if i != j) print((10 * i + j)+" ")
}
除了基本使用外,还可以使用 yield
关键字从 for 循环中产生 Vector,这称为 for 推导式。
scala> for(i <- 1 until 10) yield i+3
res0: scala.collection.immutable.IndexedSeq[Int] = Vector(4, 5, 6, 7, 8, 9, 10, 11, 12)
4 异常处理
Scala和 Java 中一样,支持 try...catch...finally
语句。并且抛出的对象时java.lang.Throwable的子类,不过和java不同的是,Scala中没有受检异常。
异常的工作方式和java基本一样,不同的是我们可以在catch
语句中使用模式匹配,下列异常处理代码整合了模式匹配
object ExceptionApp extends App{
val file =""
try {
//open file
//usr file
val i = 10/0
println(i)
}catch {
//如果不需要使用捕获的异常对象,可以用_代替
case _:ArithmeticException=>println("除数不能为0")
case e:Exception=>println(e.getMessage)
}finally {
//释放资源 close file
}
}
输出结果:除数不能为0
这里需要注意的是因为 finally
语句一定会被执行,所以不要在该语句中返回值,否则返回值会被作为整个 try 语句的返回值,如下:
scala> def g():Int = try return 1 finally return 2
g: ()Int
// 方法 g() 总会返回 2
scala> g()
res3: Int = 2