《快学Scala(第二版)》-CH2 控制结构和函数

少年壮志不言愁
劝君惜取少年时

  • 在Scala中if/else结构有返回值,这个值就是跟在if/else之后的表达式的值

     scala> val x = 2
     x: Int = 2
     scala> val s = if(x > 1) 1 else -1
     s: Int = 1
    
  • Scala中的表达式有类型,例如上面表达式if/else的类型是Int,又比如if (x>0) "a" else -1的类型是两个分支的公共超类型Any
    如果没有else,Scala中处理等同于if(x > 1) 1 else (),引入类Unit
    Unit类型只有一个值,写作()

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

  • 输出使用print/println函数

  • readLine从控制台读取一行输入,readIntreadDoublereadBytereadShortreadLongreadFloatreadBooleanreadChar读取数字、Boolean和字符

  • 循环

    • for (i <- 表达式) 让变量i遍历<-右边的表达式的所有值
    • Scala中,循环使用并不频繁,通常可用某个函数处理。
    • Scala没有提供break或者continue语句跳出循环,这里举例一下使用Breaks对象中的break方法跳出循环
      object BreakLoop {
       |   def main(args: Array[String]) {
       |     val a = 0
       |     val numList = List(1, 2, 3, 4, 5, 6)
       |     val loop = new Breaks
       |     loop.breakable {
       |       for( a<- numList) {
       |         println( "a is : " + a )
       |         if( a == 3 ){
       |         loop.break
       |         }
       |        }
       |      }
       |      println("Loop End")
       |     }
       | }
      
  • 高级for循环

    • 变量<-表达式的形式提供多个生成器,每个生成器可以带上if守卫
    • for推导式:如果for循环的循环体以yield开始,则该循环会构造出一个集合,每次迭代生成集合中的一个值
  • 定义函数:函数名、参数和函数体。Scala编译器可以通过=右侧的表达式的类型推断出函数返回类型

  • 接收可变长度参数列表的函数

     def sum(args:Int*)={ var result = 0; for(arg <- args) result += arg; result}
     val s = sum(1,2,3,4,6)
    

    函数得到的是一个类型为Seq的参数,用for循环访问每一个元素。但如果已经有一个值的序列,则不能直接传入函数中,需要告诉编译器希望这个参数被当做参数序列处理,追加:_*.

    val s = sum(1 to 5:_*) // 此处将1 to 5做参数序列处理
    
  • 过程: 如果函数体包含在花括号中但没有前面的=号, 那么返回类型就是Unit。这样的函数称为过程。过程不返回值

  • 懒值: 当val被声明为lazy时,它的初始化将被推迟,直到首次对它取值。懒值对于开销较大的初始化语句有用,是介于val和def的中间状态,val在被定义时即被取值;lazy在被首次使用时取值;def在每一次被使用时取值。懒值并非没有额外开销,每次访问懒值时都会有一个方法被调用,这个方法会以线程安全的方式检查该值是否已被初始化

  • 异常: Scala没有“受检”异常,不需要声明说函数或方法可能会抛出某种异常。控制器将在离抛出点最近的处理器中恢复,如果没有找到符合要求的异常处理器,则程序退出。

你可能感兴趣的:(《快学Scala(第二版)》-CH2 控制结构和函数)