(三)控制结构和函数



/**
  * if else 无三元运算符
  */
val x = 8
val s = if (x > 0) 1 else -1

//############################################################

/**
  * while
  * 不能直接break
  * 1.通过boolean型的控制变量
  * 2.使用嵌套函数,从函数中return
  * 3.使用Breaks对象的break方法(直接抛出异常,后续代码不能执行)
  */

import scala.util.control.Breaks

var n = 10
while (n > 0) {
  n -= 1
  println(n)
  if (n <= 5) {
    //    Breaks.break()
  }
}


//############################################################

/**
  * for
  * 生成器表达式: 变量名 <- 集合
  */
for (i <- 1 to 3) {
  println(i)
}

for (i <- 1 to 3; j <- 1 to 3) {
  println(10 * i + j)
}

for (i <- 1 to 3; j <- 1 to 3 if i != j) {
  println(10 * i + j)
}

//for 推导式可以引入变量
for (i <- 1 to 3; aa = 4 - i) println(aa)

//需要返回值用yield关键字
for (i <- 1 to 10) yield i * 3



//############################################################
/**
  * 函数
  */
//def 函数名 (参数名: 类型) [:返回类型] = 函数体
def abs(x: Double) = if (x >= 0) x else -x

//相当于下面
def abs2(x: Double) = {
  if (x >= 0) {
    x
  } else {
    -x
  }
}

abs(-8)
abs2(-8)


//递归函数(n的阶乘)
//递归一定要指明函数返回类型
def recursiveFac(n: Int): Int =
  if (n <= 0) 1 else n * recursiveFac(n - 1)

recursiveFac(5)

//函数参数默认值
def descorate(str: String = "default") =
  str

descorate()
descorate("bb")

//变长参数
//return 可以终结函数,但是需要指定函数返回类型
//变长参数通过*来指定,所有参数会转化为一个seq序列
def sum(args: Int*): Int = {
  if (args.size == 3) {
    return 0
  }
  var result = 0
  for (arg <- args) result += arg
  result
}

sum(3, 2, 1, 0)
sum(3, 2, 1)

//############################################################
/**
  * 过程
  * 不返回值得函数叫过程,返回类型是Unit,它是没有等号(=)的
  */
def box(s: String): Unit = {
  println(s)
}
//或者不写:Unit=
def box2(s: String) {
  println(s)
}


box("aaa")


//############################################################
/**
  * 异常
  * 并不像Java代码那样,需要声明方法会抛出异常
  * Throw的类型为Nothing,存在exception的if语句返回类型,Nothing类型在Scala的类层级的最低端 ; 它是任何其他类型的子类型 。
  */
def devide(x: Int, y: Int): Int = {
  if (y == 0) throw new ArithmeticException("Devide by zero")
  else x / y
}

//devide(5, 0)

try {
  devide(5, 0)
} catch {
  case ex: IndexOutOfBoundsException => println("1", ex)
  case ex: ArithmeticException => println("2", ex)
  case ex: Exception => println("3", ex)
} finally {
  println("finally!")
}

devide(5, 1)

猜你喜欢

转载自blog.csdn.net/qq_31024823/article/details/89952363