scala中的基本控制结构:1.顺序2.条件3.循环,和其他的JVM语言是一致的。
scala也有一些高级的控制结构,例如模式匹配。
if条件表达式会根据if后面括号里面的boolean来决定整个if表达式的值
1.scala中的if表达式是有返回值的!这点和Java是不同的
2.if表达式中可以进行类型推导,推导一般过程就是根据变量的值的类型来推导确定变量的类型,这在很多复杂算法的实现的时候可以让我们省略变量类型的书写,为复杂算法的实现提供了非常大的便利
3.如果if后面没有else部分,默认的实现是if()...else()
//下面的例子节选自Spark的核心类SparkContext,在else部分虽然不返回有意义的结果,但是依旧没有省略else,而是使用了else{None},
//其目的是为了确保if表达式的类型为处理逻辑需要的类型Option,而不是Any类型
if(isEventLogEnabled){some(logger)}else{None}
Scala的Option[T]是容器对于给定的类型的零个或一个元件。Option[T]可以是一些[T]或None对象,它代表一个缺失值。例如,Scala映射get方法产生,如果给定的键没有在映射定义的一些(值),如果对应于给定键的值已经找到,或None。选项Option类型常用于Scala程序,可以比较这对null值Java可用这表明没有任何值。例如,java.util.HashMap中的get方法将返回存储在HashMap的值,或null,如果找到没有任何值。
比方说,我们有一个检索来自基于主键数据库中的记录的方法:
def findPerson(key: Int): Option[Person]
该方法会返回一些 [人士] 如果找到记录,如果找不到记录那么为None。让我们来看看一个真实的例子:
object Test { def main(args: Array[String]) { val capitals = Map("France" -> "Paris", "Japan" -> "Tokyo") println("capitals.get( "France" ) : " + capitals.get( "France" )) println("capitals.get( "India" ) : " + capitals.get( "India" )) } }
当上述代码被编译和执行时,它产生了以下结果:
C:/>scalac Test.scala C:/>scala Test capitals.get( "France" ) : Some(Paris) capitals.get( "India" ) : None C:/>
使用可选值最常用的方法是模式匹配。例如:
object Test { def main(args: Array[String]) { val capitals = Map("France" -> "Paris", "Japan" -> "Tokyo") println("show(capitals.get( "Japan")) : " + show(capitals.get( "Japan")) ) println("show(capitals.get( "India")) : " + show(capitals.get( "India")) ) } def show(x: Option[String]) = x match { case Some(s) => s case None => "?" } }
当上述代码被编译和执行时,它产生了以下结果:
C:/>scalac Test.scala C:/>scala Test show(capitals.get( "Japan")) : Tokyo show(capitals.get( "India")) : ? C:/>
4.if表达式中如果有多条语句,可以使用{}包裹起来,{}中的多条语句中的最后一条是计算结果
5.{}代表了一个语句块,语句块是有值的,值就是最后一条语句,其类型是最后一条语句值的类型
6.if表达式可以用在for等其他循环控制结构,用于限制循环结果
for(x<-0 to 5 if(x == 2)){
println(x)
}
for循环
1.for循环中加入的if叫条件守卫,用于限制for循环(优化for循环,去掉不必要的执行步骤,或者说用于跳出for循环)
2.在for循环中,能够提取什么内容,取决于后面集合的类型
3.跳出for循环,除了加入if守卫以外,还可以使用return关键字
(return返回的是方法级别的)
while循环也是循环集合,来作为代码块的输入,进而完成流程的控制的,while在实际Server和Framework开发中至关重要,例如让一个线程一直循环下去,一般都会用while
import scala.util.control.Breaks._
flat = true
breakable{
while(flag){
....
break
}
}