Scala入门之控制结构

时间:2022-09-08 17:47:05
  1 package com.dtspark.scala.basics
  2 
  3  
  4 
  5 /**
  6 
  7  * Scala中的基本控制结构有顺序、条件和循环三种方式,这个其它的JVM语言是一致的,但是Scala也有一些高级的流程控制结构类模式匹配;
  8 
  9  * 在这里我们主要if、for、while等三种控制结构及其企业级最佳实践,并且在最后用Spark源码说明
 10 
 11  *
 12 
 13  */
 14 
 15 object ControlStructures {
 16 
 17   def main(args: Array[String]): Unit = {
 18 
 19     println("Scala")
 20 
 21  
 22 
 23     /**
 24 
 25      * if条件表达式会更会if会面括号里面的boolean值来决定整个if表达式的值
 26 
 27      *
 28 
 29      * 1,Scala中的if条件表达式是有值的!!! 这个Java是不一样的!
 30 
 31      * 2,  if条件表达式中可以进行类型推倒,类型推到的一般过程就是更具变量的值的类型来推倒确定变量的类型,这在很多复杂算法的实现的时候可以让我们
 32 
 33      *      省略掉变量的类型的书写,为复杂算法的实现提供了非常大的便利;
 34 
 35      * 3,如果if后面没有else部分,默认的实现是if(....) ... else ()
 36 
 37      *  下面的 例子节选自Spark的核心类SparkContext,在else部分虽然不返回有意义的结果,但是依旧没有省略else,而是使用了else { None}这种方式
 38 
 39      *  其目的是为了确保if条件表达式的类型为处理逻辑需要的类型Option,而不是Any类型,为下一步的处理大家基础
 40 
 41      *  if (isEventLogEnabled) {Some(logger) } else { None}
 42 
 43      * 4,if表达式中如果有多条语句可以使用{}包裹起来,但是这里就有一个问题了,{}中的多条语句,哪一条是计算结果呢,前面已经说明,是{}中的最后一条语句
 44 
 45      * 5,补充说明,{...} 代表了一个语句块,语句块是有值的,值就是最后一条语句,请类型是最后一条语句值的类型
 46 
 47      * 6, if表达式可以用在for循环等其它控制结构中用于限制结果
 48 
 49      */
 50 
 51     var age = 10
 52 
 53     val result = if (age > 25) "Worker" else "Student"  //此时因为"Worker" 和 "Student"都是字符串,所以result也是字符串类型
 54 
 55     println(result)
 56 
 57  
 58 
 59     val result2 = if (age > 18) "Adult" else 1 //此时因为if表达式中的else两侧的内容一个是字符串类型、另外一个是整数类型,所以result2的类型是两种的公共父类Any
 60 
 61  
 62 
 63     val result3 = if (age > 18) "Adult" else ()
 64 
 65  
 66 
 67     println(result3)
 68 
 69  
 70 
 71     var x,y =0
 72 
 73  
 74 
 75     val result4  = if(age < 18) {
 76 
 77       x = x + 1;
 78 
 79       y = y + 1;
 80 
 81       x + y
 82 
 83     } else 0
 84 
 85  
 86 
 87     println(result4)
 88 
 89  
 90 
 91     for(i <- 0 to 5 if i%2 ==0 ) {
 92 
 93       println(i)
 94 
 95     }
 96 
 97  
 98 
 99     /**
100 
101      * for循环是不断的循环一个集合,然后for循环后面的{...}代码块部分会根据for循环(...)里面提取的集合的item来作为{...}的输入进程流程控制
102 
103      * 1,for循环中加入的if叫做条件守卫,用于限制for循环(优化for循环,去掉不必要的执行步骤,或者说用于跳出for循环)
104 
105      * 2,最后再次强调一下,在for循环中能够提取出什么内容取决于后面的集合的类型!
106 
107      * 3,想跳出for循环的话,除了加入if守卫以外,还可以使用return关键字
108 
109      */
110 
111  
112 
113     var flag = true
114 
115     var sum = 0
116 
117     for(i <- 0 to 6 if flag){
118 
119       sum = sum + i
120 
121       if(5 == i) flag = false
122 
123     }
124 
125     println("sum = " + sum)
126 
127    /* sum = 0
128 
129  
130 
131     for(i <- 0 to 6){
132 
133       sum = sum + i
134 
135       if(5 == i) return //return 返回的是方法级别的,这在实际开发中也非常常用
136 
137     }*/
138 
139  
140 
141     println("sum with return = " + sum)
142 
143  
144 
145  
146 
147     for(item <- "Hello Spark".split(" ")) println(item)
148 
149  
150 
151  
152 
153  
154 
155  
156 
157     /**
158 
159      * while循环,也是循环集合来作为{...}的输入,进而完成流程的控制的,while循环在实际Server和Framework开发中至关重要,例如让一个
160 
161      * 线程一直循环下去,一般都会使用while;
162 
163      *
164 
165      */
166 
167  
168 
169  
170 
171     import scala.util.control.Breaks._
172 
173     flag =true
174 
175     breakable{
176 
177        while(flag){
178 
179  
180 
181       for(item <- "Spark"){
182 
183         println(item)
184 
185         if(item == 'r') {
186 
187           flag = false
188 
189           break
190 
191         }
192 
193       }
194 
195  
196 
197     }
198 
199     }
200 
201  
202 
203  
204 
205     println("while finished!!!")
206 
207  
208 
209  
210 
211   }
212 
213 }