scala总的控制结构跟java有很大的区别,以下是scala特色的控制结构知识点总结:
1.scala中的if表达是有返回值的
2.if条件表达式可以进行类型推导,类型推导的一般过程就是根据变量的值的类型来确定变量的类型;类型推导带来的好处就是可以省略掉变量类型的书写,为复杂算法的实现,提供了非常大便利;
3.scala中允许if语句不跟else部分,默认的实现是if(...) ... else(),注意这个else后面的()表示Unit
4.spark源码中有个不错的示例:
_eventLogger =
if (isEventLogEnabled) {
val logger =
new EventLoggingListener(_applicationId, _applicationAttemptId, _eventLogDir.get,
_conf, _hadoopConfiguration)
logger.start()
listenerBus.addListener(logger)
Some(logger)
} else {
None
}
这里写else{ None }是有原因的,若不写else{ None }这不会返回Option类型,而是返回Any类型
5.scala中{...}代表一个语句块,语句块是有值的,值就是语句块的最后一个条语句,其类型是最后一条语句的值的类型
6.for循环是不断的循环一个集合,但for循环后面的{...}代码块部分会根据for循环(...)里面提取集合的item来作为{...}的输入进程流程控制
7.for循环加入的if叫做条件守卫,用于限制for循环
8.for循环中能够提取出什么内容取决于后面的集合的类型!
object ControlStructures {
def main(args: Array[String]): Unit = {
val age = 30;
val result = if(age > 30) "Worker" else "Student" //此时"Worker"和"Student"都是字符串,所以result也是字符串
println(result)
//result2是Any类型
val result2 = if(age > 18) "Adult" else 1 //此时因为if表达式中的else两侧的内容一个是字符串类型,另外一个是整数类型,所以result2取的类型是两者的公共父类
val result3 = if(age > 18) "Adult" //result3也是Any类型的,因为默认是if(...) ... else ()
println(result3)
var x,y = 0
val result4 = if(age > 18) {
x = x + 1
y = y + 1
x + y
}else 0
println(result4)
// <- 表示提取符
for(i <- 0 to 5 if i % 2 == 0) {
println(i)
}
println("-------------------------- for循环 --------------------------")
var flag = true
var sum = 0
for(i <- 0 to 5 if flag) {
sum += i
if(5 == i) flag = false
}
println("sum = " + sum)
// sum = 0
// for(i <- 0 to 6) {
// sum = sum + i
// if(5 == i) return // return 返回是方法级别的
// }
//
println("sum with return = " + sum)
for(item <- "Hello Spark".split(" ")) println(item)
println("-------------------------- while循环 --------------------------")
import scala.util.control.Breaks._
flag = true
breakable{
while(flag) {
for(item <- "Spark") {
println(item)
if(item == 'r') {
flag = false
break //跳出了for循环
}
}
}
}
println("while finished")
}
}