看到RDD
def map[U: ClassTag](f: T => U): RDD[U] = withScope {
其实这里传递的参数是函数,函数名称是f,参数是T,返回类型是U
我们可以看到到处都是函数!!!
package com.dt.spark.scala.basics
object FunctionalPrograming {
def main(args: Array[String]) {
/**
* 1.函数和变量一样,是Scala的一等公民,函数可以直接赋值给变量
*/
val hiData = hiBigData _
hiData("hehe")
/**
* 2.函数更常用的方式是匿名函数,定义的时候只需要说明输入的参数类型和返回值类型,
* 不需要名称,一般都会把匿名函数赋值给一个变量(其实是val常量),Spark的源码中存在
* 大量这种语法!!!
*/
val f = (name: String) => println("hi," + name)
f("haha")
/**
* 3.函数可以作为参数直接传递给函数,这极大地简化了编程的语法,为什么这样说呢?
* 原因非常简单:
* 1.以前Java的方式是new一个接口的实例,并且在接口实例的回调方法中来实现业务逻辑
*现在是直接把回调方法传递给函数,且在函数体中直接使用,这毫无疑问地简化了代码的编写
* 2.这种方式非常方便编写复杂的业务逻辑和控制逻辑,对于机器学习,深度学习,图计算等等而言,至关重要
*
* 函数作为函数的参数传递的编程方式称之为高阶函数,Spark中的源码有60%都是这种代码!!!
*/
def getName(func:(String,Int) => Unit,name:String,age:Int){
func(name,age)
}
getName((name:String,age:Int) => println(name+":"+age),"xixi",5)
val mulArr=Array(1 to 10 : _*).map(item => item*2)
mulArr.foreach(x => println(x))
/**
* 4.函数式编程一个非常强大的地方在于函数的返回值可以是函数,
* 当函数的返回类型是函数的时候,这时候就表明Scala函数实现了闭包
* 闭包的内幕是:Scala的函数背后是类和对象,所以Scala的参数都作为了对象的成员!!!
* 所以后续可以继续访问,这就是实现原理的内幕
*/
def funcResult(message:String) = (name: String) => println(message + name)
/**
* 5.currying函数写法,只要是复杂的Scala的函数式编程,一定会使用这种写法!!!
* 可以维护变量在内存中的状态,从而实现返回函数的链式功能,可以实现非常复杂的算法和逻辑
*/
// def funcResult(message:String,name:String) => println(message + name)
funcResult("hi,")("Java")
val result=funcResult("hi,")
result("Java")
}
def hiBigData(name: String) {
println("hi," + name)
}
}
归纳总结:看笔记和理解其中的原理