分享

scala结构控制和函数

控制结构和函数4.1  if else表达式
scala中没有三目运算符,因为根本不需要。scalaif else表达式是有返回值的,如果if或者else返回的类型不一样,就返回Any类型(所有类型的公共超类型)。
例如:if else返回类型一样
  
val a3 = 10
  
val a4 =
  
   if(a3 > 20){
  
     "a3大于20"
  
   }else{
  
     "a3小于20"
  
  }
  
println(a4)
  
例如:if else返回类型不一样
  
val a5 =
  
   if(a3 > 20){
  
     "a3大于20"
  
  }
  
println(a5)
  
如果缺少一个判断,什么都没有返回,但是Scala认为任何表达式都会有值,对于空值,使用Unit类,写做(),叫做无用占位符,相当于java中的void
尖叫提示:行尾的位置不需要分号,只要能够从上下文判断出语句的终止即可。但是如果在单行中写多个语句,则需要分号分割。在Scala中,{}快包含一系列表达式,其结果也是一个表达式。块中最后一个表达式的值就是块的值。
4.2  while表达式
Scala提供和Java一样的whiledo循环,与If语句不同,While语句本身没有值,即整个While语句的结果是Unit类型的()
1) while循环
  
var n = 1;
  
val while1 = while(n <= 10){
  
  n  += 1
  
}
  
  
println(while1)
  
println(n)
  
2) while循环的中断
  
import scala.util.control.Breaks
  
val loop = new Breaks
  
loop.breakable{
  
   while(n <= 20){
  
     n += 1;
  
     if(n == 18){
  
       loop.break()
  
     }
  
  }
  
}
  
println(n)
  
尖叫提示:scala并没有提供breakcontinue语句来退出循环,如果需要break,可以通过几种方法来做1、使用Boolean型的控制变量 2、使用嵌套函数,从函数中return 3、使用Breaks对象的break方法。
4.3  for表达式
Scala 也为for 循环这一常见的控制结构提供了非常多的特性,这些for 循环的特性被称为for 推导式(for comprehension)或for 表达式(for expression)。
1)for示例1to左右两边为前闭后闭的访问
  
for(i <- 1 to 3; j <- 1 to 3){
  
   print(i * j + " ")
  
}
  
println()
  
2) for示例2until左右两边为前闭后开的访问
  
for(i <- 1 until 3; j <- 1 until 3)  {
  
   print(i * j + " ")
  
}
  
println()
  
3) for示例3:引入保护式(也称条件判断式)该语句只打印1 3。保护式满足为true则进入循环内部,满足为false则跳过,类似于continue
  
for(i <- 1 to 3 if i != 2) {
  
   print(i + " ")
  
}
  
println()
  
4) for示例4:引入变量
  
for(i <- 1 to 3; j = 4 - i) {
  
   print(j + " ")
  
}
  
println()
  
5) for示例5:将遍历过程中处理的结果返回到一个,使用yield关键字
  
val for5 = for(i <- 1 to 10) yield i
  
println(for5)
  
6)for示例6:使用花括号{}代替小括号()
  
for{
  
  i  <- 1 to 3
  
  j  = 4 - i}
  
   print(i * j + " ")
  
println()
  
尖叫提示:{}和()对于for表达式来说都可以。for 推导式有一个不成文的约定:当for 推导式仅包含单一表达式时使用原括号,当其包含多个表达式时使用大括号。值得注意的是,使用原括号时,早前版本的Scala 要求表达式之间必须使用分号。
4.4  函数
scala定义函数的标准格式为:
  
def 函数名(参数名1: 参数类型1, 参数名2: 参数类型2) : 返回类型 = {函数体}
  
1) 函数示例1:返回Unit类型的函数
  
def  shout1(content: String) : Unit = {
  
  println(content)
  
}
  
2) 函数示例2:返回Unit类型的函数,但是没有显式指定返回类型。(当然也可以返回非Unit类型的值)
  
def  shout2(content: String) = {
  
  println(content)
  
}
  
3) 函数示例3:返回值类型有多种可能,此时也可以省略Unit
  
def  shout3(content: String) = {
  
  if(content.length >= 3)
  
    content + "喵喵喵~"
  
  else
  
    3
  
}
  
4) 函数示例4:带有默认值参数的函数,调用该函数时,可以只给无默认值的参数传递值,也可以都传递,新值会覆盖默认值;传递参数时如果不按照定义顺序,则可以通过参数名来指定。
  
def  shout4(content: String, leg: Int = 4) = {
  
  println(content + "," + leg)
  
}
  
5) 函数示例5:变长参数(不确定个数参数,类似Java的...
  
def sum(args:  Int*) = {
  
  var result = 0
  
  for(arg <- args)
  
    result += arg
  
  result
  
}
  
6) 递归函数:递归函数在使用时必须有明确的返回值类型
  
def factorial(n:  Int): Int = {
  
  if(n <= 0)
  
    1
  
  else
  
    n * factorial(n - 1)
  
}
  
尖叫提示:
1Scala可以通过=右边的表达式  推断出函数的返回类型。如果函数体需要多个表达式,可以用代码块{}
2、可以把return 当做  函数版本的break语句。
3、递归函数一定要指定返回类型。
4、变长参数通过* 来指定,所有参数会转化为一个seq序列。
4.5  过程
我们将函数的返回类型为Unit的函数称之为过程。
1) 定义过程示例1
  
def shout1(content: String) : Unit = {
  
   println(content)
  
}
  
2) 定义过程示例2
  
def shout1(content: String) = {
  
   println(content)
  
}
  
3) 定义过程示例3
  
def shout1(content: String) {
  
   println(content)
  
}
  
尖叫提示:这只是一个逻辑上的细分,如果因为该概念导致了理解上的混淆,可以暂时直接跳过过程这样的描述。毕竟过程,在某种意义上也是函数。
4.6  懒值
val被声明为lazy时,他的初始化将被推迟,直到我们首次对此取值,适用于初始化开销较大的场景。
1) lazy示例:通过lazy关键字的使用与否,来观察执行过程
  
object Lazy {
  
  
   def init(): String = {
  
     println("init方法执行")
  
     "嘿嘿嘿,我来了~"
  
  }
  
  
   def main(args: Array[String]): Unit = {
  
     lazy val msg = init()
  
     println("lazy方法没有执行")
  
     println(msg)
  
  }
  
}
  

已有(1)人评论

跳转到指定楼层
fly2015 发表于 2018-5-3 11:55:58
scala很好的几个特性 学习了!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条