Scala 函数式编程 - 函数至简原则

Scala 函数式编程 - 函数至简原则

Scala 函数基本语法

[修饰符] def 函数名 ( 参数列表 ) [:返回值类型] = {
    函数体
}

private def test( args : String ) : Unit = {
    println(args)
}
  1. 省略return关键字。
    • 默认函数体中最后一句为返回值及类型。
    • 如果定义函数时,明确返回值是Unit,函数中的return无效。
    • 如果函数中明确通过return返回结果,那么函数的定义需要明确给出返回值类型。
    • 如果明确函数的返回值是Unit,想省略不写,而函数中有return关键字,那么需要 :Unit = 把返回值Unit和等号=一同省略。
  2. 省略{ } 。函数体中只有一条语句时,可以省略{ }。
  3. 省略返回值类型。可以推断出返回值类型,可以省略返回值类型。
  4. 省略参数列表。无参函数:可以省略( )。
    • 函数定义时,没有( ) 则使用时,就不能出现( )。定义时有( ),使用时可以省去( )。
  5. 省略等号。
    • 如果函数体中有明确的return,那么返回值类型不能省。
    • 如果省略返回值类型,那么编译器会将函数体的最后一行代码的结果作为返回值。
    • 如果函数想要无返回值,但有想省略Unit类型,那么需要把Unit = 一起省略。
    • 没有返回值类型和等号的函数称为 过程函数 。
  6. 省略名称和关键字(匿名函数)。此时函数若为空参时,( )不能省。
    • (参数列表) => { 函数体 }
    • 如果只关心函数的功能,不关心函数名,可以省略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)。可能有些参数是可有可无的,但是放在一个参数列表中时,要么进行传参,要么指定默认值,不能省略不传。而不是所有场景都有默认值的。因此把参数分成多个参数列表进行传递,就能实现某个参数列表在某种场景下不传参。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值