第4课:零基础彻底实战Scala控制结构及Spark源码解析

本课内容
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")
    }
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值