【Scala】用实例弄清楚scala几种函数的定义和特点


作为参数的函数

scala> val a1 = Array(1,2,3,4)		//这是一个数组
a1: Array[Int] = Array(1, 2, 3, 4)

scala> val f1 = (x:Int) => x * 2	//这是一个函数,命名f1
f1: Int => Int = <function1>

scala> a1.map(f1)		//函数f1可以作为参数使用
res6: Array[Int] = Array(2, 4, 6, 8)

匿名函数

scala> val a1 = Array(1,2,3,4)
a1: Array[Int] = Array(1, 2, 3, 4)

scala> a1.map((x:Int) => x * 2)		//不给其命名,直接使用称为匿名函数
res7: Array[Int] = Array(2, 4, 6, 8)

柯里化函数(currying)

柯里化(Currying) 是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。
通俗且不严谨地来说,柯里化函数就是把一个函数的多参数列表拆分为多个单参数列表

//按通常的方法以及调用是下面这样
scala> def m1(x:Int,y:Int) = x+y
m1: (x: Int, y: Int)Int

scala> m1(2,3)
res8: Int = 5

//柯里化函数
scala> def m2(x:Int)(y:Int) = x+y
m2: (x: Int)(y: Int)Int

scala> m2(2)(3)		//柯里化函数这样可以应对一些情况
res10: Int = 5		//比如方法需要拿到两个参数但只拿到一个参数

//实际上就是执行了两次函数调用
scala> m2(2)_
res11: Int => Int = <function1>	 //m2(2)_会返回一个函数

//调用的时候这样用即可
scala> res11(3)
res12: Int = 5
//可以多次调用,不是一次性的
scala> res11(7)
res13: Int = 9
//柯里化函数的运行机制就像下面这样
scala> def m3(x:Int) = (y:Int) => x+y
m3: (x: Int)Int => Int

scala> m3(2)
res14: Int => Int = <function1>

scala> res14(3)
res15: Int = 5

闭包函数

闭包就是能够读取其他函数内部变量的函数,也可以认为是对自由变量的捕获

scala> var y = 5	//定义一个变量
y: Int = 5

scala> def m1(x:Int) = x+y	//这里只给出了一个参数,但方法是x+y两个参数
m1: (x: Int)Int

scala> m1(2)	//可以看出这里直接捕获了y变量的值
res16: Int = 7

scala> var y = 2
y: Int = 2

scala> m1(2)	//但不会因为变量值的修改而更改
res17: Int = 7
原文地址:https://www.cnblogs.com/zzzsw0412/p/12772398.html