Scala 语法总结之流程控制(if、for、while、代码块)
1. 背景
- scala是一门编程语言,语法特性设计贯穿了2个思想,面向对象和函数式编程特性支持
- 在scala中,代码块也是一个对象,最小的代码单位对比java,scala中最小代码单位是函数,而java则是对象。所以scala可以有更加灵活的代码组织方式
- 在所有编程语言设计中,基本会包含的几个大块都是一样
- 数据类型
- 流程控制
- 运算符
- 注释
- 方法和函数定义
- 权限控制
- 集合
- IO流
- 网络编程
- 多线程
2. if else
- 单层if else
package com.doit.ifelse
object IfElseTest {
def main(args: Array[String]): Unit = {
if(1 == 2) {
println("世界崩塌了")
} else {
println("世界还正常")
}
// 这里可以看到value是接收了一个if else代码块对应返回值,
// 注意,scala中代码块、函数、方法中,默认最后一句代码就是返回值,除非显示指定返回值是Unit
val x = 1
val value: Any = if (x > 1) {
1
} else {
"error"
}
println("value:" + value)
}
}
- 多层if else(嵌套)
package com.doit.ifelse
object IfElseNested {
def main(args: Array[String]): Unit = {
val x = 2
val y = 3
val z = 0
if(z > x) {
println("不会发生的事情发生了,快去买彩票")
} else {
if(z > y) {
println("不会发生的事情发生了,快去买彩票")
} else {
println("是的,0确实小于3,也小于2")
}
}
}
}
- 还是一样,在scala中,代码块也是一个对象,同时代码块中,默认最后一行就是返回值,所以代码块可以使用变量或者常量保存起来,具体类型编译器会自动进行推断。
3. 代码块
package com.doit
object CodeBlock {
def main(args: Array[String]): Unit = {
val x = 0
val unit: Unit = {
val value: Any = if (2 == 2) {
println("是的,这个判断条件就是这么真,,,,")
2
} else {
println("如果这句代码执行了,我直播吃,,,,")
"哈哈,真的要吃?"
}
println(value)
}
println(unit)
}
}
4. for循环
- 和java一样,for循环分类普通for循环和增强for循环。
- 同样的,for循环也是可以多层嵌套的,不过写法上会不一样些。
- 同时for循环嵌套使用也一样,不适合嵌套过多层级,否则会导致代码可读性下降不少。
package com.doit.loop
import scala.collection.immutable
object ForTest2 {
def main(args: Array[String]): Unit = {
// to是从0开始,也包括最后的数字10
for(i <- 0 to 10){
println(i)
}
println("==============")
// until 是从0开始,但不包括最后的数字10
for(x <- 0 until 10) {
println(x)
}
println("==============")
// 直接对需要循环的数组做遍历
val ints: Array[Int] = Array(3, 4, 5, 6, 7, 9)
for(ele <- ints) {
println(ele)
}
println("==============")
// 2层循环结构
// 守卫者模式,也就是通过if对循环条件做过滤
for(i <- 0 to 9; j <- 0 to 9 if i != j) {
print(s"$i - $j" + "\t")
if(j == 9) {
println()
}
}
println()
println("==============")
// 通过yield对遍历的数组等做结果处理和搜集
val seq: immutable.IndexedSeq[Int] = for (i <- 1 to 10) yield i * 10
println(seq)
println("==============")
}
}
- 在scala里面没有运算符,都有的符号其实都是方法。
- 在scala里面没有++ – 的用法
- for( i <- 表达式/数组/集合)
- 在for循环里面我们是可以添加if表达式
- 有两个特殊表达式需要了解:
To 1 to 3 1 2 3
Until 1 until 3 12- 如果在使用for循环的时候,for循环的时候我们需要获取,我们可以是使用yield关键字。
5. while和do while循环
这个和java一样,while需要先判断是否条件再执行,do while则不管条件是否为true,都会先执行一次do代码块中代码。
package com.doit.loop
object WhileLoop {
def main(args: Array[String]): Unit = {
var n = 10
while (n < 30) {
println(n)
// 注意,scala中去掉了具有一定迷惑含义的++ 和--语法,但+= -=等语法还在
n = n + 3
// n += 3 也是一样的
}
println("====================")
var m = 10
do {
println(m)
m += 4
} while (m < 30)
}
}
6. 总结
- 作为编程语言中使用主流之一的java特性在scala中被很好的成套应用起来。带来好处就是广大的java程序员群体可以很好转换过来,这一点上kotlin语言也是如此设计的,这样可以很好降低编程语言使用门槛。
- 在scala的流程控制语句中,需要注意的是多层for循环的写法不一样,其他和java基本是一致的。
- 流程控制中,switch的实现对比java有较大改动,后续会专文说明。
- 如果没有java基础,学习scala可能会略有难度,但基本思想注意即可,scala 的语言设计处处体现出面向对象和函数式编程特性支持。记住这两点,学习scala就会好很多。