来源参考王家林老师讲解
1.函数式编程进阶:
1.函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量2.函数更常用的方式是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称,
但是如果你要调用这个函数的话,一般会把这个匿名函数赋值给一个变量,其实是val,
3.所以函数可以作为参数传递给函数,这个极大地简化了编程的语法,为什么这样说呢?原因非常简单
第一:以前Java方式是new 出一个接口实例,并且在接口实例的回调方法中,来实现业务逻辑,
现在是直接回调方法,callback,传递给我的函数,且函数体直接使用,
第二:方便编写业务逻辑,对于图计算和机器学习,深度学习至关重要
函数作为函数的参数传递的编程方式是称之为高级编程
4.函数式编程一个非常强大的地方之一是返回值可以是函数:当函数的返回类型是函数的时候,这个时候就表明Scala的函数实现了闭包
Scala闭包的内幕:Scala的背后是类和对象,所以Scala的参数都作为了对象的成员!!!,所以可以继续访问
5.Currying(柯里化) ,复杂的函数式经常使用,可以维护内存中的状态,并且返回函数的链式功能,可以实现非常复杂算法和逻辑
2.代码
2.1函数直接赋值给变量
1.函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量
object test {
def main(args: Array[String]): Unit = {
val per=pp _
per("free")
}
def pp(name:String){
println(name)
}
}
输出结果:free2.2匿名函数
object test {
def main(args: Array[String]): Unit = {
//2.函数更常用的方式是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称,
// 但是如果你要调用这个函数的话,一般会把这个匿名函数赋值给一个变量,其实是val,
val f=(name:String)=>println(name)
f("free1")
}
}
输出结果:free1
2.3函数作为参数
object test {
def main(args: Array[String]): Unit = {
/*
* 3.所以函数可以作为参数传递给函数,这个极大地简化了编程的语法,为什么这样说呢?原因非常简单
* 第一:以前Java方式是new 出一个接口实例,并且在接口实例的回调方法中,来实现业务逻辑,
* 现在是直接回调方法,callback,传递给我的函数,且函数体直接使用,
* 第二:方便编写业务逻辑,对于图计算和机器学习,深度学习至关重要
*
* 函数作为函数的参数传递的编程方式是称之为高级编程
*/
val f=(name:String) =>println(name)
def getName(func:(String)=>Unit ,name:String){
func(name)
}
getName(f,"Scala")
}
}
输出结果:Scala
2.4函数的返回值是函数4.函数式编程一个非常强大的地方之一是返回值可以是函数:当函数的返回类型是函数的时候,这个时候就表明Scala的函数实现了闭包
* Scala闭包的内幕:Scala的背后是类和对象,所以Scala的参数都作为了对象的成员!!!,所以可以继续访问
*/
def funcresult(message:String)= (name:String) =>println(message+" "+name)
// funcresult("java")("dayu") //这种方式Currying函数写法
val res=funcresult("java")//这个语句和下面一条等价于上面的一个语句
res("dayu")