Scala 函数式编程 - 函数至简原则
Scala 函数基本语法
[修饰符] def 函数名 ( 参数列表 ) [:返回值类型] = {
函数体
}
private def test( args : String ) : Unit = {
println(args)
}
- 省略return关键字。
- 默认函数体中最后一句为返回值及类型。
- 如果定义函数时,明确返回值是Unit,函数中的return无效。
- 如果函数中明确通过return返回结果,那么函数的定义需要明确给出返回值类型。
- 如果明确函数的返回值是Unit,想省略不写,而函数中有return关键字,那么需要 :Unit = 把返回值Unit和等号=一同省略。
- 省略{ } 。函数体中只有一条语句时,可以省略{ }。
- 省略返回值类型。可以推断出返回值类型,可以省略返回值类型。
- 省略参数列表。无参函数:可以省略( )。
- 函数定义时,没有( ) 则使用时,就不能出现( )。定义时有( ),使用时可以省去( )。
- 省略等号。
- 如果函数体中有明确的return,那么返回值类型不能省。
- 如果省略返回值类型,那么编译器会将函数体的最后一行代码的结果作为返回值。
- 如果函数想要无返回值,但有想省略Unit类型,那么需要把Unit = 一起省略。
- 没有返回值类型和等号的函数称为 过程函数 。
- 省略名称和关键字(匿名函数)。此时函数若为空参时,( )不能省。
- (参数列表) => { 函数体 }
- 如果只关心函数的功能,不关心函数名,可以省略def 和 函数名,这种定义方式称为匿名函数。
- 匿名函数需要赋值给变量使用。
- 变量接收函数:val f = (参数列表) => {函数体}
- 使用变量名调用函数:f( )
示例:遍历集合
//TODO 简化前
// 初始化一个集合
val range = Range(1,5)
// 声明一个函数,作用:打印传入的Int参数
def test(i:Int):Unit = {
println(i)
}
// 遍历集合
range.foreach(test)
//TODO 简化
range.foreach((i:Int) => {println(i)}) //1.匿名函数
range.foreach((i:Int) => println(i)) //2.函数体只有一条语句{ }可省
range.foreach((i) => println(i)) //3.只有一个参数,scala编译器自动推断数据类型,参数类型可省
range.foreach(i => println(i)) //4.只有一个参数,()可省
range.foreach(i => println(_)) //5.参数在方法体中只使用一次,可简化为_
range.foreach(println(_)) //6.参数在方法体中只使用一次,可简化为_,且参数可省
range.foreach(println) //7.方法中只有一个参数,可以把参数和()都省略
//集合.遍历(调用打印函数)
能不简化,就不简化,提高代码可读性。
注:关于下划线_的用法,详见:【Scala中下划线的用法】
闭包现象
在使用函数嵌套时,内部的函数使用了外部函数的变量或者方法,就是闭包现象。
在Scala中将函数赋值为变量、匿名函数、嵌套的内部函数在外部使用等都有闭包的现象。
函数柯里化
就是函数可以传递多个参数列表。多个参数列表,可以通过一个参数列表中多个参数实现(1,2,3,4,5),也可以通过多个参数列表实现(1,2),(3,4),(5)。可能有些参数是可有可无的,但是放在一个参数列表中时,要么进行传参,要么指定默认值,不能省略不传。而不是所有场景都有默认值的。因此把参数分成多个参数列表进行传递,就能实现某个参数列表在某种场景下不传参。