函数可以被简单的认为是包裹了一条或几条语句的代码体,该代码体接受若干个参数经过代码体处理后返回结果,例如数学中的f(x) = x +1,在scala中,函数是一等公民,可以像变量一样被传递,被赋值,同时函数可以赋值给变量,变量也可以赋值给函数。
**之所以这样,原因在于:函数背后是类和对象,也就是说在运行的时候函数其实是一个变量,当然背后的类是Scala语言自动帮助我们生成的,且可以天然的被序列化和反序列化,这个意义非常重要:
意义1:可以天然的序列化和反序列化的直接好处就是函数可以在分布式系统上传递。
意义2:因为函数背后其实就是类和对象,所以可以和普通的变量完全一样的应用在热河普通变量可以运用的地方,包括作为参数传递,作为返回值,被变量赋值给变量等。**
**补充:整个IT编程技术的发展史,其实就是一部封装史:
1.Function时代:在C语言中提供了函数的概念,用函数把若干条语句进行封装和复用。
2.CLass时代:在c++和java 等语言中提供了类和对象,把数据和处理数据的业务逻辑封装起来。
3.框架时代:把数据、代码和驱动引擎封装起来,是过去10年和未来10年IT技术的核心。**
###关于函数初级入门的几个要点:
- def关键字来定义函数
- 函数会自动进行类型推断,来确定函数放回值的类型。如果函数名称和函数体之间没有等于号的话则类型推断失效,此时函数类型是Unit
- 函数参数可以是函数
- 如果在函数体重无法推到出函数的类型,则必须声明具体类型
- 函数的参数可以有默认值,这样在调用函数的时候如果不想改变默认值的话,就直接不传递该参数而是直接使用默认值即可这在实际的编程中意义重大,尤其是在Spark等框架中,因为框架一般都有自己的默认配置和实现,此时我们可以非常好的使用默认值;
- 我们可以给予函数的参数的名称来调整函数的参数传递的顺序。重点在为什么可以这么做呢:原因在于函数背后其实是类,其参数就是累的成员,所以无所谓顺序。
object HelloFunctionalProgramming {
def main(args: Array[String]): Unit = {
hello("Spark",20)
println(hello("Spark",20))//函数参数可以是函数
// println(fibonacci(30))
hello("Scala")
hello(age=31,name="Scala")
println("sum="+sum(1,2,3,4,5,6,7,8))
println("sum="+sum(1 to 10 : _*))
}
def hello(name : String ,age : Int = 30) = {
println("hello my name is "+name)
println("hello my age is "+age)
age
}
def fibonacci(n : Long) : Long= {
if(n<= 1) 1
else fibonacci(n-2) + fibonacci(n-1)
}
def sum(numbers: Int* ) = {
var result = 0
for(number <- numbers)
result += number
result
}
}