Scala函数

定义普通函数(=)(后面有不须要等号的)

参数类型必须声明,函数返回类型无需声明(只要不存在递归语句,scala会自动推导出返回值类型)
容许定义默认参数,有默认值的可不传,跟Python一个德行,包括参数调用java

def helloWorld(name:String,age:Int=18) = {
    print(name,age)
}

helloWorld: (name: String, age: Int)Unit

//调用
helloWorld(age = 15)

递归函数

必须声明返回类型,由于不知道你递归到何时编程

//斐波那契数列1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144
//递归中的In = In-1 + In-2
9+8;8+7+7+6;7+6+6+5+6+5+5+4;6+5+5+4+5+4+4+3++4+3+3+2;5+4+4+3+4+3+3+2+3+2+2+1+2+1+1
 
def fab(n: Int): Int = {
  if (n < 1) {
    1
  }else{
    fab(n-1)+fab(n-2)
  }
}
print(fab(10))

变长参数

//接收到的参数为**Seq[Int] = WrappedArray(1, 23, 4, 4, 1)**
 def sum(nums:Int*) = {
    var rst = 0
    for(num <- nums){//加强for循环
        rst += rst
    }
    rst
}

传入一个已有序列

sum(1 to 5)         //错误,将一个Range赋值给Int
sum(1 to 5: _*)     //将1 to 5 这个Range解开为单个传入

与Python对比网络

def sum(*nums):
    rst = 0
    for num in nums:
        rst += num
    retuen rst

与java对比app

int sum(int...  args){
    //todo...
}

神奇的执行逻辑(也许这就是函数式编程的冰山一角吧)

//当if...else...下方无语句时,从宏观上看,if...else...做为一个总体是** = **右边**{块表达式}**的最后一条语句,因此if...else...的返回值将做为函数的返回值
def helloWorld(name: String, age: Int) = {
  if (age >= 18) {
    printf("Hello %s you are an adult!!\n", name)
    name
  } else {
    printf("Hello %s you are a little boy!!", name)
    name
  }
}
//以下
helloWorld: (name: String, age: Int)String

//反之,就不是最后一条语句了,若是没有一个变量去接收if...else...表达式的值,if...else...的返回值就没有一点意义了
def helloWorld(name: String, age: Int) = {
  if (age >= 18) {
    printf("Hello %s you are an adult!!\n", name)
    name    //多余的表达式返回值
  } else {
    printf("Hello %s you are a little boy!!", name)
    name
  }
  val i = 1
  i
}
//以下
helloWorld: (name: String, age: Int)Int

过程(不须要返回值的函数)

没有使用等号链接{}的函数称为过程,其返回值类型为Unit,也就是没有返回值函数式编程

//写法1:不写等号
def printName(name:String){
    print(name)
}
//写法2:声明无返回
def printName(name:String):Unit = {
    print(name)
}

lazy懒变量(用于耗时操做如网络,文件IO)

变量后面的表达式在定义时候不会执行任何计算,直到第一次使用,在不少时候都须要,毕竟不是全部都须要一上来就加载的,或许你可能不会有机会使用呢函数

import scala.io.Source._
lazy val myfile = fromFile("D:\\123.txt").mkString      //myfile: String = <lazy>
print(myfile)                                           //这时候才会执行计算

异常处理

使用了模式匹配的思想,catch字句里的内容跟match里的case是彻底同样的。scala

//因为异常捕捉是按次序,若是最广泛的异常,Throwable,写在最前面,则在它后面的case都捕捉不到,所以须要将它写在最后面。
try{
  fromFile("D:\\asdasdasdasd").mkString
}catch{
  case e1:IOException => println("IO Exception")//e1是异常的名字,可使用 _ 代替
}finally {
  println("close resource")
}
相关文章
相关标签/搜索