运算符
在 Scala 中其实是没有运算符的,所有运算符都是方法。我们只是省去了.方法名()中的点 . 和括号 () 。
- 调用对象的方法时,点 . 可以省略;
- 如果函数参数只有一个,或者没有参数,括号()可以省略。
//num1 + num2 num1.+(num2)
val n1 = 12 val n2 = 12 //正常写法 println(n1 + n2) println(n1 * n2) //标准过程 println(n1.+(n2)) println(n1.*(n2)) println(7.5toInt.toString) //如果函数参数只有一个或者没有,括号()可以省略 println((7.5.toInt).toString) //调用对象的方法 . 可以省略 println((7.5 toInt) toString)
流程控制
这里只说和Java中稍微不同的地方
1、if 语句
Scala和Java的 if 语句的基本用法是一致的,包括如果一个分支的逻辑代码只有一行,可以省去大括号{} ,与Java不同之处在于,Scala的 if - else 语句是可以有返回值的,具体取决于哪个分支满足条件。
案例1
import scala.io.StdIn object Test02 { def main(args: Array[String]): Unit = { //输入成绩 val score: Int = StdIn.readInt() //定义结果 val res:String = if (score < 0 || score > 100){ "输入错误" }else if (score > 0 && score < 60){ "挂科了,等着重修吧" }else{ "及格了" } println(res) } }
案例2
如果Scala的返回值类型不一致,我们可以取它们的公共祖先类型。
//输入成绩 val score: Int = StdIn.readInt() //定义结果 val res: Any = if (score < 0 || score > 100){ -1 }else if (score > 0 && score < 60){ "挂科了,等着重修吧" }else{ true } println(res)
案例3-三元运算符
Java中的三元运算符可以用Scala中的 if else 实现
val result: Any = if (score>60) true else "挂科重修" println(result)
2、For 循环结构
案例1-包含边界的范围遍历
//遍历10次 //1.范围遍历 to是一个方法的调用,是1这个整型对象调用to方法传入参数10 for (i <- 1 to 10){ println(i + "hello scala") } //完整代码: (我们用上面的写法就好) for (i <- 1.to(10)){ println(i + "hello scala") }
案例2-不包含边界的范围遍历
//遍历9次 //2.遍历 [1,10) Range默认步长=1,也就是一个一个取 for (i <- Range(1,10)){ println(i + "hello scala") } //效果和上面一样,只不过new Range的话需要指定步长 for (i <- new Range(1,10,1)){ println(i + "hello scala") } //同样 [1,10) for (i <- 1 until 10){ println(i + "hello scala") }
案例3-集合遍历
for (i <- Array(1,5,8)){ println(i) } for (i <- List(1,5,8)){ println(i) } for (i <- Set(1,5,8)){ println(i) } for (i <- Map(("a",1),("b",2),(5,3))){ println(i) }
循环守卫
案例-输出1-10,不输出5
如果用 Java:
for (int i=1;i<=10;i++){ if(i==5){ continue; }else{ System.out.println(i); } }
但是如果用Scala只需要2行:
//循环守卫 for (i <- 1 to 10 if i!=5){ print(i+" ") }
循环步长
输出1、3、5 、7 、9
//循环步长 for (i <- 1 to 10 by 2){ print(i + " ") } //效果一样 推荐上面的写法 for (i <- new Range(1,10,2)){ print(i + " ") }
逆序输出10-1
//设置步长为 -1 for (i <- 10 to 1 by -1){ print(i + " ") } //直接翻转输出 for (i <- 1 to 10 reverse){ print(i + " ") }
步长为 0.5
前提:步长数据类型为浮点数,范围也必须是小数范围
for (i <- 1.0 to 10.0 by 0.5){ print(i + " ") }
二维数组打印
1,2,3 1,2,3 1,2,3
通常写法
for (i <- 1 to 3){ for (j <- 1 to 3) { print(s"第${i}行的内容: " + j + " ") } println() }
精简写法
for (i <- 1 to 3; j <- 1 to 3){ println(s"第${i}行的内容: " + j + " ") }
99乘法表
有手就行
for (i <- 1 to 9){ for (j <- 1 to i) { print(s"${j} * ${i} = ${i * j} ") } println() }
精简写法
for (i <- 1 to 9; j<- 1 to 9){ print(s"${j} * ${i} = ${i * j} ") if (j==i) println() }
引入变量
引入一个变量,这个变量和 i 的值有关。
for (i <- 1 to 10;j = 10 - i){ println(s"i=${i},j=${j} ") }
通常的写法
for { i <- 1 to 10 j = 10 - i } { println(s"i=${i},j=${j} ") }
九层妖塔
需求:传入参数 n ,输出 n 层妖塔
def main(args: Array[String]): Unit = { print_town(10) } def print_town(floor: Int): Unit ={ for { i <- 1 to floor j = 2 * i - 1 //当前行 * 的个数 l = floor * 2 - 1 //最后一行的 * 的个数 k = (l - j) / 2 //当前行空格的个数 }{ print(" "*k) println("*"*j) } }
输出结果:
* *** ***** ******* ********* *********** ************* *************** ***************** *******************
循环返回值
循环的返回值是将每次循环的结果保存到一个集合当中的,最后一起返回
案例-返回1-10的平方
//返回一个集合 val res: immutable.IndexedSeq[Int] = for (i <- 1 to 10) yield i * i print(res)
运行结果:
Vector(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)
可以看到,代码十分简洁,这也说明了Scala对于处理大数据的方便性。
While 循环
和 Java 的用法一模一样,但Scala并不推荐使用 While 循环。因为我们如果希望通过while循环得到某个结果,就需要在循环外部定义一个变量(类似于全局变量),在循环内部进行相关的处理,如果在大数据处理的场景下,我们往往是并行处理,这样如果我们每个机器执行的代码块操作的是同一个变量,显然结果是不正确的。所以一般更加推荐的是 for 循环这种可以有返回值的循环。
案例-输出1-10
var a = 1 while (a <= 10){ println(a) a += 1 }
循环中断
Scala并没有 continue 和 break,是为了更好地实现函数式编程,推荐使用函数式的风格解决break和continue的功能,而不是一个关键字。Scala 中使用breakable 控制结构来实现 break 和 continue 功能。
案例-输出0-4 [在2处中]
Breaks.breakable( for (i <- 0 until 5) { if (i == 3) Breaks.break() println(i) } )
原理:Breaks.breakable()的原理其实是通过 try-catch 抛出异常来终止循环。
我们自己也可以实现:
try { for (i <- 0 until 5) { if (i == 3) Breaks.break() println(i) } }catch{ case e: Exception => RuntimeException } }
最简写法
我们可以直接导入整个Breaks类的所有方法,直接通过方法名来实现,简化代码
//下划线 _ 相当于Java的 * import scala.util.control.Breaks._ breakable( for (i <- 0 until 5) { if (i == 3) break() println(i) } )