Scala 深入浅出实战经典 第2讲 Scala函数定义、流程控制、异常处理入门实战

一、课程前导
DT大数据梦工厂的微信公众号是DT_Spark,每天都会有大数据实战视频发布,请您持续学习。
Scala 深入浅出实战经典(1-64讲)完整视频、PPT、代码下载:
百度云盘:http://pan.baidu.com/s/1c0noOt6
腾讯微云:http://url.cn/TnGbdC
360云盘:http://yunpan.cn/cQ4c2UALDjSKy  访问密码 45e2
Scala是最为重要的大数据语言,该视频每天还在持续跟新中,预计大约有140讲,请您根据上述视频彻底掌握Scala实战技术。

酷6:http://v.ku6.com/show/cYNlmbVTl4xaMuevyq1kSQ...html?from=my
    51cto:http://down.51cto.com/data/2074330
    搜狐视频:http://my.tv.sohu.com/pl/9020529/80441056.shtml
    土豆 http://www.tudou.com/programs/view/uyfijW3J0JA/
最后,王家林老师个人的微信是18610086859

二、课程内容
    第2讲 Scala函数定义、流程控制、异常处理入门实战

    1.函数
    Scala除了方法外还支持函数。方法对于进行操作,函数不是。
    要定义函数,你需要给出函数的名称、参数和函数体。语法如下:
    def 函数名(值1:参数类型1) = 函数体
    必须给出所有参数的类型。
    只要函数不是递归的,就不需要指定返回类型。Scala编译器可以通过=符号右侧的表达式的类型推断出返回类型。
    如果函数体需要多个表达式完成,可以用代码块。块中最后一个表达式的值就是函数的返回值。例如:
    def fac(n : Int) = {
        var i = 1
        for(i  <- 1 to n) r = r *i
        r
    }//r的值就是函数的值
    在匿名函数中,return并不返回值给调用者,它只是跳出到包含它的带名函数中。可以把return当做是函数版的break语句,尽在需要时使用。
    对于递归函数,必须指定返回类型。例如:
    def fac(n : Int) : Int = if(n <= 0) 1 else n * fac(n - 1)
package com.scala.chapter02

object Hello {
  def main(args : Array[String]) : Unit = {
    println("Hello Scala!")
    //doWhile
    println(looper(100,298))
  }
 
  def  doWhile(){
    var line = ""
    do{
      line = readLine()
      println("Read:" + line)
    }while(line != "")
  }
 
  def looper(x : Long, y : Long) : Long = {
    var a = x  //100
    var b = y  //298
    while(a != 0){
      val temp = a  //100 98  
      a = b % a  //98 = 298%100 100%98
      b = temp  //100  98
    }
    b
  }
}
    2.1条件表达式
    在Scala中if/else表达式有值,这个值就是跟在if或else之后的表达式的值。你可以将if/else表达式的值赋值给变量:
    val s = if(x > 0) 1 else -1
    这与如下语句的效果一样:
    if(x > 0) s = 1 else s = -1
    不过,第一种写法更好,因为它可以用来初始化一个val。而在第二种写法当中,s必须是var。
    Scala中的分号绝大多数情况下不上必需的。
    Scala的if/else将在Java和C++中分开的两个语法结构if/else和?:结合在了一起。
    在Scala中,每个表达式都有一个类型。如果一个表达式的类型不统一,它们的公共超类型叫做Any。
    如果else部分缺失了,比如:
    if(x > 0) 1
那么有可能if语句没有输出值。但是在Scala中,每个表达式都应该有某种值。这个问题的解决方案是引入Unit类,写作()。不带else的这个if语句等同于
    if(x > 0)1 else ()
    你可以把()当做是表示“无有用值”的占位符,将Unit当做Java或C++中的void。
说明:Scala没有switch语句,不过它有一个强大得多的模式匹配机制。
2.2语句终止
    在Scala中,行尾的位置不需要分号。不过,如果你想在单行中写下多个语句,就需要将它们以分号隔开。
    如果你在写较长的语句,需要分行来写的话,就要确保第一行以一个不能用语句结尾的符号结尾。
    s = s0 + (v - v0) * t +//告诉解析器这里不是语句的末尾
       0.5 * (a - a0) * t * t
2.3块表达式和赋值
    在Scala中,{}块包含一系列表达式,其结果也是一个表达式。块中最后一个表达式的值就是块的值。这个特性对于那种对某个val的初始化需要分多步完成的情况很有用。例如:
    val distance = {val dx = x - x0;val dy = y - y0;sqrt(dx * dx + dy * dy)}
    {}块的值取其最后一个表达式。
    在Scala中,赋值动作本身是没有值的——或者,更严格地说,它们的值是Unit类型的,这个类型只有一个值,写作“()”。
    由于赋值语句的值是Unit类型的,所以不能把一个Unit类型的值赋值给一个变量。
2.4输入和输出
    如果要打印一个值,可以用print或println(最后换行),另外,还有一个带有C风格化字符串的printf函数。
    可以用readLine函数从控制台读取一行输入。如果要读取数字、Boolean或者是字符,可以用readInt、readShort、readLong、readFloat、readDouble、readBoolean或者readChar。与其他方法不同,readLine带一个参数作为提示字符串。
    readLine("Your name:")
    readInt()
2.5循环
    Scala拥有与Java和C++相同的while和do循环。
    Scala没有与for(初始化变量;检查变量是否满足某条件;更新变更)循环直接对应的结构。如果你需要这样的循环,有两个选择:一是使用while循环,二是使用如下for语句:
    for(i < -1 to n)//1 to n这个调用返回数字1到数字n(含)的Range(区间)。
        r = r * i
    遍历字符串或数组时,通常需要使用从0到n - 1的区间。你也可以用until方法而不是to方法,util方法返回一个并不包含上限的区间。
    val s = "Hello"
    var sum = 0
    for(i <= 0 util s.length)
        sum += s(i)
    你也可以直接遍历对应的字符序列:
    var sum = 0
    for(ch <= "Hello") sum += ch
    在Scala中,对循环的使用并不如其他语言那么频繁。可以通过对序列中所有值应用某个函数的方式来处理它们,而完成这项工作只需要一次方法调用即可。
    说明:Scala并没有提供break或continue语句来推出循环。有如下几个选项实现break的作用:
    1、使用Boolean型的控制变量。
    2、使用嵌套函数——可以从函数当中return。
    3、使用Breaks对象中的break方法。
2.6高级for循环和for推导式
    Scala中的for循环比起Java和C++功能要丰富得多。
    可以以变量<-表达式的形式提供多个生成器,用分号将它们隔开。例如:
    for(i <- 1 to 3;j <- 1 to 3)print((10 * i + j) + " ")
    //将打印11 12 13 21 22 23 31 32 33
    每个生成器都可以带一个守卫,以if开头的Boolean表达式:
    for(i <- 1 to 3;j <- 1 to 3 if i != j)print((10 * i + j)+ " " )
    //将打印11 13 21 23 31 33
    如果for循环的循环体以yield开始,则该循环会构造出一个集合,每次迭代生成集合中的一个值:
    for(i <- 1 to 10)yield i % 3
        //生成Vecor(1,2,0,1,2,0,1,2,0,1)
    这类循环叫做for推导式。
    for推导式生成的集合与它的第一个生成器是类型兼容的。例如:
    for(c <- "Hello";i <- 0 to 1)yield(c + i).toChar
    //将生成"HIefmlmop"
说明:如果你愿意,你也可以将生成器、守卫和定义包含在花括号当中,并可以以换行的方式而不是分号来隔开它们:
    for{ i <-
        from = 4 - i;
        j <- from to 3}

    2.异常
    Scala异常的工作机制和Java和C++一样。当抛出异常时,比如:
    throw new IllegalArgumentException("x should not be negative")
    当前的运算被中止,运行时系统查找可以接受IllegalArgumentException的异常处理器。控制权将在离抛出点最近的处理器中恢复。如果没有找到符合要求的异常处理器,则程序退出。
    和Java一样,抛出的对象必须是java.lang.Throwable的子类。与Java不同的是,Scala没有“受检”异常——你不需要声明说函数或者方法可能会抛出某种异常。
    throw表达式有特殊的类型Nothing。这在if/else表达式中很有用。如果一个分支的类型是Nothing,那么if/else表达式的类型就是另一个分支的类型。
    捕获异常的语法采用的是模式匹配的语法,例如:
    try{
        process(new URL("http://horstmann.com/fred-tiny.gif"))
    }catch{
        case _:MalformedURLException => println("Bad URL:" + url)
        case ex:IOException => ex.printStackTrace()
    }
    和Java或C++一样,更通用的异常应该排在更具体的异常之后。
    如果不需要使用捕获的异常对象,可以使用“_”来替代变量名。
    try/finally语句让你可以释放资源,不乱有没有异常发生。
    注意,try/catch和try/finally的目的是互补的。try/catch语句处理异常,而try/finally语句在异常没有被处理时执行某种动作(通常是清理工作)。可以把它们结合在一起成为单个try/catch/finally语句:
    try{...}catch{...}finally{...}
    这和下面的语句一样:
    try{try{...}catch{...}}finally{...}
    object Exception {
  def main(args : Array[String]){
    val n = 99
    try{
      val half = if(n % 2 == 0)
        n / 2
      else new RuntimeException("N must be event")
    }catch{
      case e: Exception => println("The exception is :" + e.getMessage)
    }finally{
      
    }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值