1.函数说明:
def map[U : ClassTag](f : T => U) : RDD[U] = withScope{
1.1 其中f 表示函数名称;T表示输入参数;U表示返回值类型
1.2 map是一个函数,其参数为(f : T => U)函数,只不过,函数名为f, 函数类型为 T => U
2.函数要点概述:
2.1 函数可以直接赋值给变量
2.2 函数更常用的方式是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称,但是如果你需要使用的话,一般会把这个匿名函数赋值给一个变量(其实是val常量)
2.3 所以函数可以作为参数直接传递函数(其实现有点类似c语言中指向函数的指针),所带来的好处如下:
a ) 在使用java的时候我们可以利用多态,首先new出一个接口的实例回调方法来实现业务逻辑,现在直接把回调方法传递给我们的函数,且在函数体中直接使用,这
毫无疑问的简化了代码编写,提升了开发效率
b) 这种方式非常方便编写复杂的业务逻辑和控制逻辑;
2.4 闭包的概念:函数的返回值也可以是函数;当函数的返回类型是函数的时候,这个时候就表明Scala的函数实现了闭包;Scala是完全面向对象的语言,所以可以理解函 数本身也是一个对象,scala的参数也是对象成员,所以后续可以继续访问,这就是Scala实现闭包的原理
2.5 Currying : 柯里化函数也是函数式编程的一个重要内容,下面将会为你展示柯里化函数的具体应用实例:
object functionInScala {
def main(args: Array[String]): Unit = {
//1.将方法转换成函数
val helloworld = hello _
helloworld("robin")
//2.匿名函数的使用
val f = (name:String) => println("Hi," + name)
f("I am robin")
//3.函数作为参数传递给函数实例;第一个参数是函数,第二个参数是名字
def getName(func:(String) => Unit,name:String) {
func(name)
}
getName(f,"argument") //打印结果:Hi,argument
//4. 这里1 to 10作为可变参数传入
val multipeArray = Array(1 to 10:_*).map{(item:Int) => 2 * item}.foreach(x => println(x))
//5.返回值是函数 ==> 闭包
def closure(message:String) = (name:String) => println(message + ":" + name)
/**
* 执行流程:returnFunc("Hello") 返回 (name:String) => println("Hello" + ":" + name)
* ("World")又将参数传递给(name:String) => println("Hello" + ":" + name)
* 即等同于:
* val result = returnFunc("Hello")
* result("World")
*/
closure("Hello")("World") //Currying 柯里化函数
}
def hello(name : String): Unit = {
println("hello " + name)
}
}