package com.dt.spark.scala.basics
/**
* Scala中的基本控制结构,有顺序,条件和循环三种方式,这和其他的JVM语言是一致的
* 但是scala也有一些高级的流程控制结构,在这里我们主要if,for,while等三种控制结构及其企业级最佳实践
* 并且在最后用Spark源码说明
*/
object ControlStructs {
def main(args: Array[String]) {
println("Scala")
var age = 10
/**
* if条件表达式会根据if后面括号里面的布尔值来决定整个if表达式的值
* 1.Scala中的if条件表达式有值的!!!这和Java是不一样的
*/
val result = if (age > 25) "Worker" else "Student" //此时都是字符串,所以result也是字符串类型
println(result)
/**
* 2.if条件表达式可以进行类型推导,类型推导的一般过程就是根据变量的值来确定变量类型,
* 这在很多复杂算法的实现的时候可以让我们省略掉变量的类型的书写,为复杂算法的实现提供了
* 非常大的便利
*/
val result2 = if (age > 18) "Adualt" else 1 //此时因为一个是字符串,一个是整数类型,所以result2的类型是两者的公共父类,是Any
/**
* 3.如果if后面没有else部分,默认的实现是if(...) .... else ()
* 在Spark中可以经常看到这样的代码:
* if(....) Some(...) else None
* 在else部分虽然不返回有意义的结果,但是依旧没有省略else,而是使用了else None
* 其目的是为了确保if条件表达式的类型为处理逻辑需要的类型Option,而不是Any类型,
* 为下一步处理打下基础
*/
val result3 = if (age > 18) "Adualt"
println(result3)
var x, y = 0
val result4 = if (age < 18) {
x = x + 1
y = y + 1
x + y
} else 0
println(result4)
/**
* 4.if表达式可以用在for循环等控制结构中用于限制结果
*/
for (i <- 0 to 5 if i == 2)
println(i)
/**
* for循环是不断循环一个集合,然后for循环后面的{。。。}的代码块部分会根据for(。。。)里面
* 提取的内容作为代码块的输入进行流程控制
* 1.for循环中加入的if叫条件守卫,用于限制for(优化if,去掉不必要的执行步骤,或者用于跳出for循环)
* 2.最后再次强调一下,在for循环中能提取出什么内容取决于后面的集合的类型
*/
var flag = true
var sum = 0
for (i <- 0 to 6 if flag) {
sum = sum + i
if (5 == i) flag = false
}
println(sum)
for (item <- "Hello Spark".split(" ")) println(item)
/**
* 跳出for循环的方式,除了使用if守卫之外,还可以使用return 关键字
*/
// for(i <- 0 to 6) {
// sum=sum+i
// if(5==i) return //return 返回的是方法级别,这在实际开发中也非常常用
// }
println("haha")
/**
* while循环也是,也是循环集合作为 {...}的输入,进而完成流程的控制,while循环在实际的server和freamework中是非常重要的
* 例如让一个线程一直循环下去,一般都会使用while循环
*/
flag = true
import scala.util.control.Breaks._
breakable {
while (flag) {
println("while....")
for (item <- "Spark") {
println(item)
if (item == 'r') {
flag = false
break
}
}
}
}
}
}
归纳总结:1.if表达式的特征,结合代码来看
2.跳出for/while循环的方式