Scala中的基本控制结构

时间:2022-09-08 17:51:39
package Basic

import com.sun.beans.decoder.TrueElementHandler
import com.sun.xml.internal.ws.wsdl.writer.document.Import

/**
 * Scala中的基本控制结构有顺序、条件和循环三种方式,这和其它的JVM语言是一致的,但是Scala也有一些高级
 * 的流程控制结构,例如:模式匹配;  在这里我们主要学习if for while等这三种控制结构及其企业级最佳实践,
 * 并且在最后用Spark源码说明。
 */
object ControlStructures {
  def main(args: Array[String]): Unit = {
    println("Scala")
    var age=10
    /**
     * 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}
     * 4、if表达式中如果有多条语句可以使用{}包裹起来,但是这里就有一个问题了,{}中的多条语句,哪一条是计算结果呢,是{}中的最后一条语句
     * 5、补充说明,{...}代表了一个语句块,语句块是有值的,值就是最后一条语句,其类型是最后一条语句值的类型。
     * 6、if表达式可以用在for循环等其它控制结构中用于限制结果
     */
    //此时因为"worker"和“Student”都是字符串,所以result也是字符串类型
    val result=if(age>25) "Worker" else "Student"
    println(result)
    
    //此时因为if表达式中的else两侧的内容是一个是字符串类型,另一个是
    //整数类型,所以result2的类型是两种的公共父类Any
    val result2=if(age>18) "Adult" else 1
    
    val result3=if(age>18) "Adult" //else ()
      
    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){
      println(i)
    }
    
    /**
     * for循环是不断的循环一个集合,然后for循环后面{...}代码块部分会根据for循环(...)里面提取的集合的item来作为{...}代码块的输入进行流程控制
     * 1、for循环中加入的if叫做条件守卫,用于限制for循环(优化for循环,去掉不必要的执行步骤,或者说用于跳出for循环)
     * 2、最后再次强调一下,在for循环中能够提取出什么内容取决于后面的集合的类型
     * 3、想跳出for循环的话,除了加入if守卫之外,还可以使用return关键字
     */
    var flag=true
    var sum=0
    for(i<- 0 to 6 if flag){
      sum=sum+i
      if(5==i) flag=false
    }
     println("sum = "+sum)
     
//    sum=0
//    for(i <- 0 to 6){
//      sum=sum+i
//      //return返回的是方法级别的,这在实际开发出非常常用
//      //return之后的部分不用被 执行
//      if(i==5) return
//    }
//    println("sum = "+sum)
    
    for(item<- "hello spark".split(" ")) println(item)
    
    /**
     * while循环,也是循环集合来作为{...}代码块的输入,进而完成流程 的控制,while循环在实际Server和Framework开发中至关重要。
     * 
     *
     */
    import scala.util.control.Breaks._  //要用到break关键字,必须导入此包
    flag=true
//     while(flag){
//        for(item<-"spark"){
//          println(item)
//          if(item=='r'){ 
//            flag=false
//            break
//           }
//        }
//      }
    /*
     * break要和breakable一起使用,不然就会报错
     */
    breakable{
       while(flag){
        for(item<-"spark"){
          println(item)
          if(item=='r'){ 
            flag=false
            break
           }
        }
      }
    }
   
  }
}