函数式编程
Scala函数式编程是scala的重中之重,老师多次强调它的重要性,spark当中的计算都是用scala函数式编程来做,高级函数也是其独特的一个特性,并且spark基于集合,这样可以使scala发挥其对于集合计算的强大功能。首先,函数/变量同是一等公民,函数与变量同等地位,函数的定义可以单独定义,可以不依赖于类、接口或者object,而且独立存在,独立使用,并且可以赋值给变量。
如:
这里我们定义了一个函数fun1,然后将他赋值给力一个变量,格式为
val变量名 = 函数名+空格+_
这里函数名后面必须要有空格,表明是函数的原型。
这样,这个变量就是函数了,如上如,fun_v会接收一个String类型的参数,对参数作用会返回unit类型的返回值(=>表示对左边的参数进行右边的加工)。
匿名函数
而在大量的spark中大都用的是匿名函数(不为函数命名),然后将其复制个一个变量。
如:
匿名函数格式:
Val 变量名 = (参数:类型) => 函数体
高阶函数
高阶函数是函数的参数也是函数。(因为函数的参数可以是变量,而函数又可以赋值给变量,即函数和变量地位一样,所以函数参数也可以是函数)
如:
首先我们定义了一个函数BigData,这个函数有两个参数,第一个参数是一个函数,函数名是func,他有一个String类型的参数并且返回值是unit空的;第二个参数是String类型的变量名为content的变量,函数体是将第二个参数作为第一个参数也就是函数func的参数,来调用第一个函数,整个函数返回值为unit空。这里只要传入的函数的格式与定义的一致就行。
又如:
Array.map()作用,他会遍历array中每一个元素,并将每个元素作为具体的值传给map中的作为参数的函数。
高阶函数的返回值是函数(更为重要)。
首先,我们定义一个函数作为返回值的一个函数,func_Returned返回的是一个字符串类型的。
我们输入func_Returned(“Spark”),生成了一个名为Spark的函数。
首先我们定义了一个返回值为函数的函数func_Returned,然后我们将其返回值也就是一个函数赋值了变量returned,这样就得到了一个名为returned的函数,然后我们调用returned函数得到了打印结果。
高阶函数有个非常有用的特性是类型推断。其可以自动推断出参数的类型,而且对于只有一个的参数的函数,可以省略掉小括号,并且在函数的参数作用的函数体内只是用一次函数的输入参数的值话,就可省略掉函数名,用下划线(_)代替。
最原始的方法 :
由于scala可以类型推断,而且func只有一个参数,由于在spark定义是一定义了变量类型,所以我们就可以把name后的类型String去掉,
由于只有一个参数故小括号也可以去掉,
有由于只有一个参数,所以其参数可以省略,用下划线代替
例如:
函数的闭包
函数的闭包就是当函数的参数超出其作用域时,我们还能对参数进行访问。例如:
在这里我们首先定义了返回值为函数的一个函数,然后我们调用了该函数,传入的参数为Spark,通常当函数scala运行结束后,我们是不能在访问该参数了,因为局部变量Spark的作用域也就是生命周期结束了,但是当我们调用funcResult函数后,发现它是能访问参数Spark的。这就是函数的闭包。scala内部是创建了一个函数的内部对象,将参数Spark作为一个成员保留在了这个对象中。
科里化:将一个函数的两个参数,我们可以把它转换成两个函数,第一个函数会接收原函数的第一个参数,第二个的函数会接收原函数的第二个参数作为输入变量的函数。
例如:
其利用了闭包。
scala高级操作
reduceLeft:他会从(1 to 100)中最左边的数(也就是1)开始,进行reduce操作,具体操作,先对第一元素与第二元素进行处理,并将结果作为第一个元素与第三个元素进行处理,然后在结果与第四个元素进行处理,一直到最后一个元素。
在这里“Thecontent is :” + _是一个函数。
例如:单词拆分
List.zip操作
------------------------------------------EOF--------------------------------------------------------------------------
说明: 笔记来源DT大数据IMF课程。