一、运算符
Scala 中的运算符和 Java 中的运算符基本相同。
算术运算
关系运算
逻辑运算
赋值运算
位运算
在 Scala 中其实是没有运算符的,所有运算符都是方法的调用。
当调用对象的方法时,点.可以省略
如果函数参数只有一个,或者没有参数,()可以省略
运算符优先级:
(characters not shown below)
* / %
+ -
:
= !
< >
&
^
|
(all letters, $, _)
复制代码
举个栗子:
object Test {
def main(args: Array[String]): Unit = {
// 标准加法运算
val i: Int = 1.+(1)
// 当调用对象的方法时,.可以省略
val n: Int = 1 + (1)
// 如果函数参数只有一个,或者没有参数,()可以省略
val m: Int = 1 + 1
println(i + " , " + n + " , " + m)
}
}
复制代码
二、流程控制
Scala 中的流程控制与其他的编程语言一样,也包含分支语句、循环语句等。
if - else
基本语法:
if (条件表达式) {
代码段
}else if (条件表达式) {
代码段
}else {
代码段
}
复制代码
举个栗子:
object Test01_ifelse {
def main(args: Array[String]): Unit = {
println("请输入你的年龄:")
val age: Int = StdIn.readInt();
if (age >= 18 && age < 30) {
println("中年")
} else if (age < 18) {
println("少年")
} else {
println("老年")
}
}
}
复制代码
特殊之处:
与其他语言不同的是,Scala 中的if else
表达式其实是有返回值的,也可以作为表达式,定义为执行的最后一个语句的返回值
Scala 中返回值类型不一致,取它们共同的祖先类型。
返回值可以为Unit
类型,此时忽略最后一个表达式的值,得到()
scala 中没有三元条件运算符,可以用if (a) b else c
替代a ? b : c
嵌套分支特点相同。
举个栗子:
object Test01_ifelse {
def main(args: Array[String]): Unit = {
println("请输入你的年龄:")
// 分支语句的返回值
val result: Unit = if (age >= 18) {
println("恭喜你,成年了")
} else if (age < 18) {
println("不好意思,你还未成年")
} else {
println("你是个人了")
}
println("result:" + result)
val result2: String = if (age >= 18) {
println("恭喜你,成年了")
"恭喜你,成年了"
} else if (age < 18) {
println("不好意思,你还未成年")
"不好意思,你还未成年"
} else {
println("你是个人了")
"你是个人了"
}
println("result:" + result2)
// 不同类型返回值取公共父类
val result3: Any = if (age >= 18) {
println("恭喜你,成年了")
"恭喜你,成年了"
} else if (age < 18) {
println("不好意思,你还未成年")
age
} else {
println("你是个人了")
age
}
println("result:" + result3)
// java中的三元运算 a?b:c scala中使用 if (a) b else c
val res: String = if(age>=18){
"成年"
}else{
"未成年"
}
val res1 = if (age>= 18) "成年" else "未成年"
}
}
复制代码
for
Scala 中的for
循环被称为for
的推导式
范围遍历:
for (i <- 1 to 10) {
println(i + ":hello world")
}
复制代码
for (i <- 1 until 10) {
println(i + ":hello world")
}
复制代码
范围也是一个集合,也可以遍历普通集合。
for (i <- Array(10, 28, 9, 3, 2)) {
println(i)
}
for (i <- List(10, 28, 9, 3, 2)) {
println(i)
}
for (i <- Set(10, 28, 9, 3, 2)) {
println(i)
}
复制代码
循环步长: by + 步长
for (i <- 1 to 10 by 2) {
println(i)
}
for (i <- 30 to 10 by -2) {
println(i)
}
复制代码
循环守卫:
循环守卫,即循环保护式(也称条件判断式,守卫)。保护式为 true
则进入循环体内部,为 false
则跳过,类似于 continue
。
语法:
for(i <- collection if condition) {
}
复制代码
等价于:
if (i <- collection) {
if (condition) {
}
}
复制代码
举个栗子:
for (i <- 1 to 10) {
if (i != 5) {
println(i)
}
}
for (i <- 1 to 10 if i != 5) {
println(i)
}
复制代码
循环嵌套:
嵌套循环可以将条件合并到一个for
中。
语法:
for (i <- 1 to 3) {
for (j <- 1 to 3) {
println("i = " + i + ",j = " + j)
}
}
复制代码
等价于:
for (i <- 1 to 3; j <- 1 to 5) {
println("i = " + i + ",j = " + j)
}
复制代码
举个栗子:打印乘法表
object Test03_PracticeMulTable {
def main(args: Array[String]): Unit = {
for (i <- 1 to 9; j <- 1 to i) {
print(s"$j * $i = ${i * j} \t")
if (j == i) println()
}
}
}
复制代码
循环引入变量:
循环中的引入变量,但不是循环变量。
for (i <- 1 to 10; j = 10 - i) {
println("i = " + i + ", j = " + j)
}
复制代码
等价于:
for {
i <- 1 to 10;
j = 10 - i
} {
println("i = " + i + " , j = " + j)
}
复制代码
循环返回值:
val a: Unit = for (i <- 1 to 10) {
println(i)
}
复制代码
yield:Java 中线程的一个方法是 yield 表示线程让步
scala 中是一个关键字 表示:在当前 for 循环里面生成一个集合类型作为返回值,然后返回。
==将遍历过程中处理的结果返回到一个新 Vector 集合中,使用 yield 关键字。==
val b: immutable.IndexedSeq[Int] = for (i <- 1 to 10) yield i * i
// default implementation is Vector, Vector(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)
复制代码
while 和 do......while
While 和 do..While 的使用和 Java 语言中用法相同,不推荐使用,结果类型是Unit
。
语法:
while (循环条件) {
循环体(语句)
循环变量迭代
}
do{
循环体(语句)
循环变量迭代
} while(循环条件)
复制代码
循环中断
Scala 内置控制结构特地去掉了 break
和 continue
,是为了更好的适应函数式编程,推荐使用函数式的风格解决break
和continue
的功能,而不是一个关键字。Scala 中使用breakable
控制结构来实现 break
和 continue
功能。
抛出异常的方式中断循环
try {
for (i <- 0 until 5) {
if (i == 3)
throw new RuntimeException
println(i)
}
} catch {
case e: Exception => // 退出循环
}
复制代码
使用 scala 中的 Breaks 中的 break 方法(相当于只是封装了异常捕获),实现异常的抛出和捕捉。
import scala.util.control.Breaks
Breaks.breakable(
for (i <- 0 until 5) {
if (i == 3)
Breaks.break()
println(i)
}
)
复制代码
本次分享的内容到这里就结束了,希望对大家学习 Scala 语言有所帮助!!!
评论