Scala入门【运算符和流程控制】

运算符 

        在 Scala 中其实是没有运算符的,所有运算符都是方法。我们只是省去了 .方法名() 中的点  .   和括号 () 
  1. 调用对象的方法时,点 . 可以省略
  2. 如果函数参数只有一个,或者没有参数,括号()可以省略。
//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)
      }
    )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

让线程再跑一会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值