运算符
- 调用对象的方法时,点 . 可以省略;
- 如果函数参数只有一个,或者没有参数,括号()可以省略。
//num1 + num2
num1.+(num2)
val n1 = 12
val n2 = 12
//正常写法
println(n1 + n2)
println(n1 * n2)
//标准过程
println(n1.+(n2))
println(n1.*(n2))
//Scala中用对象来调用方法时 点 . 可以省略
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)
}
)