scala详细笔记(三)scala基础语法之流程控制

IF...ELSE语句

1.1 if...else 语句

def main(args: Array[String]): Unit = {
  val x = 1
  //判断x的值,将结果赋给y
  val y = if (x > 0) 1 else -1
  //打印y的值
  println("y=" + y)

  //支持混合类型表达式
  val z = if (x > 1) 1 else "error"
  //打印z的值
  println("z=" + z)

  //如果缺失else,相当于if (x > 2) 1 else ()
  val m = if (x > 2) 1
  println("m=" + m)

  //在scala中每个表达式都有值,scala中有个Unit类,写做(),相当于Java中的void
  val n = if (x > 2) 1 else ()
  println("n=" + n)

  //if和else if
  val k = if (x < 0) 0
  else if (x >= 1) 1 else -1
  println("k=" + k)
}

1.2 ​​​​​​​if...else 嵌套语句

if(布尔表达式 1){
  // 如果布尔表达式 1 为 true 则执行该语句块
  if(布尔表达式 2){
    // 如果布尔表达式 2 为 true 则执行该语句块
  }}

def main(args: Array[String]) {
  var x = 30;
  var y = 10;
  if( x == 30 ){
    if( y == 10 ){
      println("X = 30 , Y = 10");
    }
  }
}

总结:

1)if条件表达式它是有返回值的

2)返回值会根据条件表达式的情况会进行自动的数据类型的推断。

 

2 块表达式

块表达式的最后一行就是这个块表达式的返回值 , 如果最后一行是打印数据 返回值是()

val x = 0
val result = {
  if(x < 0)
    1
  else if(x >= 1)
    -1
  else
    "error"
}
println(result)

2.1 例子

object BlockDemo {
  def main(args: Array[String]): Unit = {
    /**
     * 大括号的开始到大括号的结束就是一个代码块
     * if() {代码块 }
     * if(){码块} else {代码块}
     * -------流程控制的if 只会执行一个代码块中的内容
     * ------- 这个代码块的最后一行就是这个代码块的返回值
     * -------- 代码块的返回值的数据类型是自动推导的
     * 由此可以推导 if else 流程控制也是有返回值的  并且只有一个返回值
     * 当代码块的最后一行的返回值类型不一致的时候 使用父类型来接收结果
     * ----当代码块的最后一行是打印内容的代码  返回值是()  意思就是没有返回值
     */
   val b =  {
      "hello"
       1
    }
    // 使用b2来接收if else 的返回值
    val b2:AnyVal = if(7 < 6){  // b2:Int 不对  b2:String 不对  两种类型的父类 欧了
      "成立"
      7
    }else{
      "恼子有病"
      println("....")
    }
    println(b2)
  }
}

 

3 for循环

java: for(int i=0;i< 10;i++){}     传统for 循环  增强for循环

语法格式: for (i <- 表达式/数组/集合)

to   到   包含后面的数据

until 到   不包含后面的数据

def main(args: Array[String]): Unit = {
  //for(i <- 表达式),表达式1 to 10返回一个Range(区间)
  //每次循环将区间中的一个值赋给i
  for (i <- 1 to 10)
    print(i+"\t")

  //for(i <- 数组)
  println()
  val arr = Array("a", "b", "c")
  for (i <- arr)
    println(i)

  //高级for循环
  //每个生成器都可以带一个条件,注意:if前面没有分号
  for(i <- 1 to 3; j <- 1 to 3 if i != j)
    print((10 * i + j) + " ")
  println()

  //for推导式:如果for循环的循环体以yield开始,则该循环会构建出一个集合
  //每次迭代生成集合中的一个值
  val v = for (i <- 1 to 10) yield i * 10
  println(v)

}

总结:

1)在scala里面没有运算符,都有的符号其实都是方法。

2)在scala里面没有++  -- 的用法

3)for( i  <-  表达式/数组/集合)

4)在for循环里面我们是可以添加if表达式

5)有两个特殊表达式需要了解:

    To  1 to 3   1 2 3

    Until  1 until 3  12

6)如果在使用for循环的时候,for循环的时候我们需要获取,我们可以是使用yield关键字。

3.1例子

/**
 * for循环入门语法
 * for(e <- Range(1 to/until N) , Array , 集合)  e就是元素
 *
 *
 */
object ForDemo1 {
  def main(args: Array[String]): Unit = {
    /**
     * Range对象  一个范围数据
     */
    val r1 = 1 to 10 // Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    val r2 = 1 until 10 //Range(1, 2, 3, 4, 5, 6, 7, 8, 9)
    // 遍历一个range
    for (i <- 1 to 10) {
      // println(i)
    }
    for (i <- 1 until 10) {
      //  println(i)
    }
    val arr = Array[String]("a", "f", "b", "s", "k")
    // 遍历数组   取出数组中的每个元素 赋值给e
    for (e <- arr) {
     // println(e)
    }
    // 使用数组的角标的形式
    for (index <- 0 until arr.length) {
      println(arr(index))
    }
  }
}
/**
 * 嵌套for循环
 * 先执行外层循环一次  内层循环执行完
 */
object ForDemo2 {
  def main(args: Array[String]): Unit = {
    // 传统的嵌套循环
    for(i<- 1 to 3){
      for(j <- 1 to 3){
       // println(i+"----"+j)
      }
    }
    // 新形式的嵌套循环
    for(i<-1 to 3 ;j <- 1 to 3){
      if(j>=i){
        print(i+"*"+j+"="+i*j +"\t")
        if(j==3){println}
      }

    }


  }

}
/**
 * 守卫模式 : 对循环的数据进行筛选
 * for(i <- 1 to 100 if i % 2 == 0)  单个条件
 *  for (i <- 1 to 100 if i % 2 == 0 && i > 80)   多个条件使用 && 连接
 */
object ForDemo3 {

  def main(args: Array[String]): Unit = {
    for (i <- 1 to 10) {
      // 条件判断  符合条件的才答应
      if (i % 2 == 0) {
        print(i + "  ")
      }
    }
    println()
    // 守卫模式  效率更高  简洁
    for (i <- 1 to 10 if i % 2 == 1) { // 只循环5次
      print(i + "  ")
    }
    println()
    val arr = Array("tom", "tim", "cat", "jerry")
    //判断
    for (e <- arr) {
      if (e.startsWith("t")) println(e)
    }
    // 守卫模式
    for (e <- arr if !e.startsWith("t")) {
      println(e)
    }
    println()
    for (i <- 1 to 100 if i % 2 == 0 && i > 80) {
      println(i)
    }
  }
}
/**
 * 推导式:  简化如下场景
 * 过滤出一百以内的偶数  需要存储这些数据
 * java怎么做 遍历出来  创建一个数组  集合 在for循环中添加进去
 * for(int i = 0 ; i<=100 ; i++){
 * if(i%2==0){
 *   list.add(i)
 *  }
 * }
 *
 */
object ForDemo4 {
  def main(args: Array[String]): Unit = {
    // 将100以内的偶数存起来  alt + enter  Seq类似于数组的序列
    var res: Seq[Int] = for(i <-  1 to 100 if i%2==0) yield  i
    var res2: Seq[Int] = for(i <-  1 to 100 if i%2==0) yield  i*10  // 可以对遍历出来的元素进行操作  操作以后再存储起来
    // 遍历res
    for(e <- res){
      println(e)
    }
  }
}
**
 * 99乘法表
 */
object For99 {
  def main(args: Array[String]): Unit = {
    for(i <- 1 to 9 ; j <- 1 to i){
      print(s"$j * $i = "+i*j +"\t")
      if(i ==j) println()
    }
  }
}
/**
 * 终止for循环
 * java中有 break  return continue
 * return  跳出方法  后面的代码无法执行
 *
 */
object BreakFor {

  def main(args: Array[String]): Unit = {
    for (i <- 1 to 10){
     // println(i)
     // if (i==5)  return
    }
    var flag = true

    /**
     * 只有满足守卫模式中的条件的时候才会进入循环
     */
    for (i <- 1 to 10 if flag){
      println(i)
      if(i == 5)  flag = false
    }
     println("hhhh")

  }

}

4 while和 do while

var  n = 10
while(n<20){
  println(n)
  n+=1
}
var n = 10
do{
  println("I first do")
  n-=1
}while(n<10 && n>0)

总结:

1)while使用跟java一模一样

2)注意点:在scala里面不支持 i++  i-- 等操作

统一写成 i-=1

4.1 例子

/**
 * for循环都有循环次数 ,
 * 当不知道数据的循环次数的情况下可以使用while循环
 * while循环容易产生死循环问题, 一定注意改变循环条件
 */
object WhileDemo1 {
  def main(args: Array[String]): Unit = {
    var i = 1
    while(i < 10){
      println(s"我喜欢学习 说 $i 次")
      // 在scala没有++ 运算   --  +=
      i +=1    // 修改终止的条件
    }
  }

}
object WhileDemo2 {
  def main(args: Array[String]): Unit = {
    // 定义一个数组对象
    var arr = Array(2,4,6,8,10,11,12,13,14,15,16,17)
    // 将数组转换成迭代器
    val iterator = arr.toIterator
    // 遍历迭代器中的数据
    while(iterator.hasNext){
      val e = iterator.next()
      println(e)
    }
  }
}
**
 * do {}  while(条件表达式)
 * 在while()语法中只要不满足条件 他可能一次也不执行
 * do while 至少会执行一次
 */
object DowhileDemo {
  def main(args: Array[String]): Unit = {

    // 至少执行一次
    do{
      println("就是那么吊  , 至少会执行一次!!")
    }while(false)
    // 正常循环
    var i = 1
    do{
      println("就是那么吊  , 至少会执行一次!!")
      i+=1   // 修改条件
    }while(i<10)
  }

}

 

猜你喜欢

转载自blog.csdn.net/qq_37933018/article/details/106909626
今日推荐