Scala——条件表达式

197 阅读2分钟

「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战

条件表达式

scala的 if/esle 语法结构与Java一样,但是在scala中 if/else 表达式有值,这个值就是跟在 if 或 else 之后表达式的值。

我们可以将 if/else 表达式的值赋予给变量

if&else

val s = if (x>0) 1 else -1
它等价于
if (x>0) s = 1 else s = -1

案例:

def main(args: Array[String]): Unit = {
    println(computed(2))
    println(computed(1))
    println(computed(19))

    def computed(value: Int): Int = {
      val isEnd = 18
      import math._
      val s: Int = if (value >= 0 && value <= isEnd) value else -1;
      s
    }
  }
——————————————————————————————————————————————————————————————————
输出:
2
1
-1

不过,第一种写法更好,因为它可以用来初始化一个 val , 而第二种写法中, s 必须是 var 。

在Scala中,每个表达式都有一个类型。

如果是混合类型,则类型为 Any 。

如果 else 部分缺失,例如:

if (x>0) 1

等价于

if (x>0) 1 else ()

案例:

def main(args: Array[String]): Unit = {
    println(computed(2))
    println(computed(1))
    println(computed(19))
    def computed(value: Int): AnyVal = {
      val isEnd = 18
      val s  = if (value >= 0 && value <= isEnd)  value
      s
    }
  }
__________________________________________________________
输出:
2
1
()

语句终止

在scala中,分号绝大多数情况下都不是必须的。不过如果你想在单行中写下多个语句,则需要将它们以分号隔开

块表达式和赋值

在Scala中, {} 包含一系列表达式,块中最后一个表达式的值就是块的值。


def main(args: Array[String]): Unit = {
    /**
     * {}块的带值属性案例
     */
    println(computed(10, 20))

    def computed(value: Int, sum: Int) = {
      val y = {
        val x = value
        x * x //返回的是10*10
      } + {
        sum * sum //返回的是20*20
      }
      y //返回的是100+400=500
    }
  }
__________________________________________________
输出:
500

在Scala中赋值语句是没有值的,所以别把它们串接在一起。

x = y = 1 //别这样做

输入和输出

使用 print 或者 println 打印一个值。

使用 printf 格式化输出。当然可以直接在输出语句中

def main(args: Array[String]): Unit = {
    printExample()
    def printExample(): Unit = {
   //变量声明
        val name = "Bessen"
        val age = 80
        val url = "www.bessen.com"

        //字符串通过+号连接(类似java)
        println("name=" + name + " age=" + age + " url=" + url)

        //printf用法:字符串通过 % 传值,类似于C语言。
        printf("name=%s, age=%d, url=%s \n", name, age, url)

        //插值字符串:字符串通过$引用,类似于jQuery
        println(s"name=${name}, age=$age, url=$url")

        //字符串前加f格式化变量
        println(f"name=${name}, age=${age}%.2f, url=$url")

        //raw得到原始的值,不识别\n
        print(raw"name=${name}, age=${age}%.2f, url=$url \n")
    }
  }

_______________________________________________________
输出:
name=Bessen age=80 url=www.bessen.com
name=Bessen, age=80, url=www.bessen.com 
name=Bessen, age=80, url=www.bessen.com
name=Bessen, age=80.00, url=www.bessen.com
name=Bessen, age=80%.2f, url=www.bessen.com \n

使用 readLine 从控制台读取一行输入,如果是读取数字, Boolean 或者字符串,可以使用 readInt , readDouble , readByte , readShort , readLongreadFloatreadBoolean或者 readChar。与其他方法不同,readLine 带一个参数作为提示字符串。

def main(args: Array[String]): Unit = {
    println(s"readInt:${readInt()}")
    println(s"readDouble:${readDouble()}")
    println(s"readByte:${readByte()}")
    println(s"readShort:${readShort()}")
    println(s"readLong:${readLong()}")
    println(s"readFloat:${readFloat()}")
    println(s"readBoolean:${readBoolean()}")
    println(s"readChar:${readChar()}")
    println(s"readLine:${readLine()}")
  }
--------------------------------------------------
输出:
1
readInt:1
13
readDouble:13.0
12
readByte:12
14
readShort:14
12232345
readLong:12232345
456
readFloat:456.0
false
readBoolean:false
h
readChar:h
这是一行数据
readLine:这是一行数据

循环

scala支持 while 循环和 for 循环, while 循环与Java的 while 一样, for 循环语法如下:

for(i<表达式)for( i <- 表达式)

for循环是支持嵌套使用的

def main(args: Array[String]): Unit = {

    for (i <- 1 to 3; j <- 1 to 3)
      print((10 * i + j) + " ")

    println("\n等价于")
    
    for (i <- 1 to 3)
      for (j <- 1 to 3)
        print((10 * i + j) + " ")

    println("")
  }
______________________________________________________
输出:
11 12 13 21 22 23 31 32 33 
等价于
11 12 13 21 22 23 31 32 33

遍历字符串和数组时,你通常需要使用 0 到 n-1 的区间,这个时候可以使用 until 方法而不是 to 方法。 until 方法返回一个并不包含上限的区间

def main(args: Array[String]): Unit = {
    for (i <- 1 to 3) {
      print(i)
    }
    println()
    for (i <- 1 until 3) {
      print(i)
    }
    println()
  }
______________________________________________
输出:
123
12

另外for循环还支持指定步长,在表达式当中使用by关键字

def main(args: Array[String]): Unit = {
   for (i <- 1 to 10 by 2){
     print(i+"\t")
   }
println()
}
___________________________________________
输出:
1	3	5	7	9

如果 for 循环的循环体以 yield 开始,则该循环会构造出一个集合,每次迭代出集合中的一个值:

def main(args: Array[String]): Unit = {
    val result = for (i <- 1 to 10) yield i
    println(result)
  }
___________________________________________
输出:
Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

for循环当中可以嵌套if判断,在判断条件满足的时候才可以进入循环体

def main(args: Array[String]): Unit = {
    val result = for (i <- 1 to 10 if i%2==0) yield i
    println(result)
  }
______________________________________________________
输出:
Vector(2, 4, 6, 8, 10)

这类循环叫做 for 推导式。

scala中没有break关键字,但是可以采用对象的方式进行中断

def main(args: Array[String]): Unit = {
  breakable{
    for (i<-1 to 10 ){
      println(s"当前为数字$i")
      if (i==5){
        println(s"数字${i}进入了判断")
        break()
      }
    }
  }
}
________________________________________
输出:
当前为数字1
当前为数字2
当前为数字3
当前为数字4
当前为数字5
数字5进入了判断