一、函数字面量及函数的定义
### --- 函数字面量及函数的定义
~~~ Scala中函数为头等公民,不仅可以定义一个函数然后调用它,
~~~ 还可以写一个未命名的函数字面量,然后可以把它当成一个值传递到其它函数或是赋值给其它变量。
~~~ 函数字面量体现了函数式编程的核心理念。
~~~ 字面量包括整数字面量、浮点数字面量、布尔型字面量、字符字面量、字符串字面量、
~~~ 符号字面量、函数字面量等。什么是函数字面量呢?
~~~ 在函数式编程中,函数是“头等公民”,可以像任何其他数据类型一样被传递和操作。
~~~ 函数的使用方式和其他数据类型的使用方式完全一致,
~~~ 可以像定义变量那样去定义一个函数,函数也会和其他变量一样,有类型有值;
~~~ 就像变量的“类型”和“值”是分开的两个概念一样,
~~~ 函数的“类型”和“值”也成为两个分开的概念;函数的“值”,就是“函数字面量”。
### --- 编程示例
scala> def add1(x: Int): Int = { x + 1 }
add1: (x: Int)Int
// 函数的类型为: (Int) => Int
// 输入参数列表只有一个括号,可以简写为: Int => Int
scala> def add2(x: Int, y: Int): Int = { x + y }
add2: (x: Int, y: Int)Int
// 函数的类型为: (Int, Int) => Int
scala> def add3(x: Int, y: Int, z: Int): Int = { x + y + z }
add3: (x: Int, y: Int, z: Int)Int
// 函数的类型为: (Int, Int, Int) => Int
scala> def add4(x: Int, y: Int, z: Int): (Int, Int) = { (x + y, y + z) }
add4: (x: Int, y: Int, z: Int)(Int, Int)
// 函数的类型为: (Int, Int, Int) => (Int, Int)
### --- 函数类型
~~~ 函数类型:(输入参数类型列表) => (输出参数类型列表)
~~~ 只有一个参数时,小括号可省略;函数体中只有1行语句时,大括号可以省略;
~~~ 把函数定义中的类型声明部分去除,剩下的就是函数的“值”,# 即函数字面量:
~~~ 对 add1 而言函数的值为:(x) => x+1
~~~ 对 add2 而言函数的值为:(x, y) => x+y
~~~ 对 add3 而言函数的值为:(x, y, z) => x+y+z
~~~ 对 add4 而言函数的值为:(x, y, z) => (x+y, y+z)
~~~ 在Scala中我们这样定义变量: val 变量名: 类型 = 值;
![](https://i-blog.csdnimg.cn/blog_migrate/2dd90c8d493238ac448961cec0397f02.png)
### --- 我们可以用完全相同的方式定义函数: val 函数名: 函数类型 = 函数字面量
~~~ 在Scala中有自动类型推断,所以可以省略变量的类型 val 变量名 = 值。
val add1: Int => Int = (x) => x+1
val add2: (Int, Int) => Int = (x, y) => x + y
val add3: (Int, Int, Int) => Int = (x, y, z) => x + y + z
val add4: (Int, Int, Int) => (Int, Int) = (x, y, z) => (x + y, y + z)
### --- 同样函数也可以这样: val 函数名 = 函数字面量
~~~ 要让编译器进行自动类型推断,要告诉编译器足够的信息,所以添加了 x 的类型信息。
val add1 = (x: Int) => x + 1
val add2 = (x: Int, y: Int) => x + y
val add3 = (x: Int, y: Int, z: Int) => x + y + z
val add4 = (x: Int, y: Int, z: Int) => (x + y, y + z)
### --- 函数的定义:
~~~ val 函数名: (参数类型1,参数类型2) => (返回类型) = 函数字面量 val 函数名 = 函数字面量
~~~ 函数字面量:(参数1:类型1,参数2:类型2) => 函数体 val 函数名 = (参数1:类型1,参数2:类型2) => 函数体