本课内容
1.零基础实战Scala控制结构
2.控制结构在Spark源码中的鉴赏
------------------------------------------------------------------------------------------------------------------------
* Scala中的基本控制有顺序、条件和循环三种方式,
* 这个其他的JVM语言是一致的,但是Scala也有一些高级
* 的流程控制结构类模式匹配
*
* 在这里我们主要if、for、while等三种控制结构及企业级最佳实践,
* 并且在最后用Spark源码说明
object C4 {
def main(args:Array[String]):Unit={
/*
* if表达式会根据if括号里面的boolean值来决定整个if表达式的值
*
* 1.Scala if表达式是有值的,Java是没有的
*/
var age = 30
var result = if(age > 35)"Worker" else "Student"
//此时因为"Worker"和"Student"都是字符串,所以result也就是字符串类型
println(result)
/**
* 2.if条件表达式可以进行类型推倒,类型推倒的一般过程就是根据
* 变量的值的类型来推倒确定变量的类型,这在很多的复杂算法的实现
* 的时候可以让我们省略掉类型的书写,为复杂算法实现提供了非常大
* 的便利
*/
var result2 = if(age > 8)"Adult" else 1
//此时因为if表达式中的else两侧的内容一个是字符串,另一个是整数型
//所以result2的类型是两种的公共父类型Any
/**
* 3.如果if后面没有了else部分,默认的实现是if(...)...else()
*
* 下面的例子选自Spark的核心类SparkContext,在else
* 部分虽然不返回有意义的结果,但是依旧没有省略else,而是
* 使用了else{None}这种方式,其目的是为了确保if条件表达
* 的类型为处理逻辑需要的类型Option,而不是Any类型,为下
* 一步的打下基础
*
* if(isEventLogEnable){Some(logger)}else{ None}
*/
var result3 = if(age > 55)"Adult"
//如果没有else,那么result3的类型是Any
println("result3:"+result3)
/**
* 4.if表达式如果有多条语句可以使用{}包裹起来,但是
* 这里就有一个问题,{}中的多条语句,哪一条使计算结果呢,
* 前面已经说明,是{}中的最后一条语句
*
* 5.补充说明,{...}代表了一个语句块,语句块是有值的,
* 值就是最后一条语句,其类型是最后一条语句值得类型
*/
var x,y = 0
val result4 = if(age < 33){
x = x+1
y = y+1
x+y
}else 0
println("result4:"+result4)
/**
* 6.
* i值来源: <-(小于号减号):值的提取符
* 写法:i <- 0 to 5 或者 i <- 0.to(5)
* if表达式可以用在for循环等其他控制结构,用于限制结果
*
*/
for(i <- 0 to 5 if i==2){
println(i)
}
/* for循环是不断的循环一个集合,然后for循环后面的{...}
* 代码块部分会根据for循环(...)里面的提取的集合的item
* 来作为{...}的输入进程流程控制
*
* 1.for循环中加入的if叫做条件守卫
* 用于限制for循环(优化for循环,去掉不必要的执行步骤,或者说用于跳出for循环)
*/
var flag = true
var sum = 0
for(i <- 0 to 6 if flag){
sum = sum + i
if(5 == i)flag = false
}
println("sum:"+sum)
/**
* 2.最后再次强调一下,在for循环中能提取什么内容
* 取决于后面集合的类型
*
*/
for(item <- "Spark")println(item)
for(item <- "Hello Spark")println(item)
for(item <- "Hello Spark".split(" "))println(item)
/*
* 3.想跳出for循环的话,除了加入if守卫以外,还可以使用
* return关键字
*
*/
var sum2 = 0
for(i <- 0 to 6){
sum = sum + i
//if(5 == i)return //return 返回是方法级别的,这在实际开发中也是非常常用
}
println("sum2:"+sum2)
/**
* while循环,也是循环集合来作为{...}的输入,进而完成
* 流程的控制的,while循环在实际Server和FrameWork
* 开发中至关重要,例如让一个线程一直循环下去,一般都会
* 使用while
*/
import scala.util.control.Breaks._
var flag2 = true;
breakable{
while(flag2){
for(item <- "Spark"){
println(item)
if(item == 'r'){
//flag2 = false
break
}
}
}
}
println("while finish")
}
} |