包含的内容

  1. 函数定义,声明
  2. 函数运行机制
  3. 递归
  4. 过程
  5. 惰性函数和异常

函数式高级编程

  1. 值函数(函数字面量)
  2. 高阶函数
  3. 闭包
  4. 应用函数
  5. 柯里化函数,抽象控制

函数的定义

基本语法

1
2
3
4
def 函数名([参数名:参数类型],.…)[[:返回值类型]=]{
语句...
return返回值
}
  1. 函数声明关键字为def (definition)
  2. [参数名:参数类型], ..:表示函数的输入(就是参数列表),可以没有。如果有,多个参数使用逗号间隔
  3. 函数中的语句:表示为了实现某一功能代码块
  4. 函数可以有返回值,也可以没有
  5. 返回值形式1返回值类型=
  6. 返回值形式2:=表示返回值类型不确定,使用类型推导完成
  7. 返回值形式3:表示没有返回值,return不生效
  8. 如果没有return ,默认以执行到最后一行的结果作为返回值

递归调用

函数递归需要遵守的重要原则(重要)

  1. 执行一个函数时,就需要创建一个新的受保护的独立空间(新函数栈)
  2. 函数的局部变量时独立的,不会相互影响
  3. 递归必须向退出递归的条件逼近,否者就是无限递归,死归了
  4. 当一个函数执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁

递归的案例

Recursion.scala

函数的注意事项和细节讨论

  1. 航速的形参列表可以是多个,如果函数没有形参,调用时可以不带
  2. 形参列表和返回值列表的数据类型可以是值类型或者引用数据类型
  3. Scala中函数可以根据函数体最后一行代码自行推断函数返回值类型。那么在这种情况下,return关键字可以省略
  4. 因为Scala可以自行推断,所以在省略关键字的场合,返回值类型也可以省略
  5. 如果函数明确使用return关键字,那么函数返回就不能使用自行推断了,这时要明确写成 :返回值类型= ,当然如果你什么都不写即使有return 返回值为()
  6. 如果函数明确声明没有返回值(声明Unit),那么函数体中即使使用return关键字也不会有返回值
  7. 如果明确函数无返回值或不确定返回值类型那么返回值类型可以省略或者生命成为Any
  8. Scala语法中任何的语法结构都可以嵌套其他语法结构(灵活)即:函数中可以再声明/定义函数,类中可以再声明类,方法中可以再声明方法和定义方法
  9. Scala函数的形参,在声明函数时,直接赋初始值(默认值),这时调用函数时,如果没有指定实参,则会使用默认值,如果指定了实参,则实参会覆盖默认值
  10. 如果函数存在多个参数,每一个参数都可以设定默认值,那么这个时候,传递的
    参数到底是覆盖默认值,还是赋值给没有默认值的参数,就不确定了(默认按照声明顺序[从左到右])。在这种情况下,可以采用带名参数
  11. scala函数的形参默认是val的,因此不能在函数中进行修改。
  12. 递归函数无法使用返回参数推导来进行判断递归后的值,必须明确指定返回的数据类型
  13. Scala函数支持可变参数

可变参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
object Details04 {
def main(args: Array[String]): Unit = {
println(sum(10, 1, 1, 1, 1, 1, 1))
}

def sum(n1: Int, args: Int*): Int = {
var sum = n1
for (item <- args) {
sum += item
}
println(args.length)
return sum
}
}
  1. args是集合,通过for循环可以访问到各个值
  2. 案例演示:编写一个·函数sum可以访问到一到多个int的和
  3. 可变参数需要写在形参列表的最后

过程

基本介绍

将函数的返回类型为Unit的函数称之为过程(procedure),如果明确函数没有返回值,那么等号可以省略

惰性函数

介绍

当函数返回值被声明成lazy时,函数的执行将被推迟,直到我们首次对此取值,该函数才会执行。这种函数我们称之为**惰性函数,**在Java的某些框架中成为懒加载(延时加载)

注意事项

  1. lazy不能修饰var类型的变量
  2. 不但是在调用函数时,加了lazy,会导致函数的执行被推迟,我们在声明一个变量时,如果给声明了Lazy,那么变量值也会推迟