Scala 函数式编程_函数是Scala中的一等公民
一等公民表现在:
1.可以传递、赋值
2.嵌套函数和匿名函数
3.具有高阶函数
4.偏应用
5.闭包
1.可传递
first_class_function.scala
// 接收一个函数作为参数
def func(f: () => String) = println(f())
func(() => "hello world!") //传递一个匿名函数
def foo() = "hello world!"
func(foo) // 把foo函数作为一个参数传递
val fun = (x: Int) => print(x) // 定义一个函数 fun
fun(2)
运行并输出,
C:\WorkSpace6-scala\scala-train\src\com\usoft>scala first_class_function.scala
hello world!
hello world!
2
2.嵌套函数
def foo() {
def bar() {
println("hello world!")
}
bar //返回一个函数
}
foo //调用一个无参函数,可以不用加括号
3.匿名函数
lambda:函数字面量(Function literal)
(x:Int,y:Int) => x +y
参数 右箭头 函数体
上面语句产生一段匿名函数,类型为(Int,Int) => Int
注意:scala中函数的参数个数为0到22个
4.高阶函数
第一种:用函数做参数的函数。eg:
def f2(f: () => Unit) {
f()
}
def f1() {
println(1)
}
f2(f1)
f2(() => println("hello world!"))
第二种:产生的结果是一个函数的函数。eg:
def hf(): Int => Int = x => x + 1
val fun = hf
fun(2) //output:3
5.函数柯里化
//当函数具有多个参数时
def sum(x: Int, y: Int) = x + y
//参数被打散后,两个参数分开
def sum2(x: Int)(y: Int) = x + y
sum2(1)(2) //output:3
// 直接返回一个函数
def first(x: Int) = (y: Int) => x + y
first(1)(2)
函数链
把一个带有多个参数的函数,转换为多个只有一个参数的函数来执行
f(1)(2)(3) 相当于 ((f(1))(2))(3)
带入参数 1执行 fa(1) 然后 带入参数2执行 fb(2) 接着带入参数3执行fc(3) 最后得到结果
6.闭包
在java中匿名内部类访问局部变量是,局部变量必须声明为final(类似闭包的实现)
scala> (x: Int) => x + more
<console>:8: error: not found: value more
(x: Int) => x + more
^
scala> val more = 1
more: Int = 1
scala> val addMore = (x: Int) => x + more
addMore: Int => Int = <function1>
scala> addMore(1)
res1: Int = 2
如下代码,
val more = 1
val addMore = (x: Int) => x + more
val res = addMore(1)
println(res)