大数据Spark“蘑菇云”行动-第12课:Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏

原创 2016年08月29日 14:07:29

一言不合直接看代码:

  def map[U: ClassTag](f: T => U): RDD[U] = withScope {
    val cleanF = sc.clean(f)
    new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF))
  }

在map这个方法中,传递参数就是一个函数
函数名称是f,函数的输入参数是T, 返回类型是U。

接下来,本文将详细讲解函数式编程。


1、函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量;

scala>   def hiBigData(name: String){
     |     println("Hi, " + name)
     |   }
hiBigData: (name: String)Unit

scala> val hi=hiBigData _
hi: String => Unit = <function1>

scala> hi("spark")
Hi, spark

2、函数更长用的方式是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称,
但是要使用的话,一般会把这个匿名函数赋值给一个变量(其实是val常量),Spark源码中大量存在这种语法。
看一个匿名函数示例:

scala> val f=(name:String) => println("Hi ,"+name)
f: String => Unit = <function1>

scala> f("kafka")
Hi ,kafka

3、函数可以作为参数直接传递给函数。

scala> def getName(func: String => Unit, name: String){
     | func(name)
     | }
getName: (func: String => Unit, name: String)Unit

scala> getName(f,"Scala")
Hi ,Scala

以上示例,极大的简化的编程的语法:
第一:以前Java的方式是new出一个接口实例,并且在接口实例的回调方法callback中来实现业务逻辑,现在是直接把回调方法callback传递给我的函数,且在函数体中直接使用,这毫无疑问的简化的代码的编写,提升了开发效率;
第二:这种方式非常方便编写负责的业务逻辑和控制逻辑,对于图计算、机器学习、深度学习等而言至关重要;
函数作为函数的参数传递的编程方式是称之为高阶函数的编程方式,Spark源码和应用程序开发中至少60%都是这种代码,必须务必一定要掌握。
下面是Array自带的map和foreach方法,把函数作为参数传递的示例:

scala> Array(1 to 10: _*).foreach{x=>println(x)}
1
2
3
4
5
6
7
8
9
10

scala> Array(1 to 10: _*).map{(i:Int) => 2* i}.foreach{x=>println(x)}
2
4
6
8
10
12
14
16
18
20

4、函数式编程,函数的返回值可以是函数。

scala>  def funcResult = (name: String) => println( "HI : " + name)
funcResult: String => Unit

scala> funcResult("java")
HI : java

scala>  def funcResult(msg:String) = (name: String) => println(msg+ ", HI : " + name)
funcResult: (msg: String)String => Unit

scala> funcResult("java")
res7: String => Unit = <function1>

scala> res7("good")
java, HI : good

scala> funcResult("java")("good!")
java, HI : good!

//等同于下面两个代码
scala>    val result = funcResult("java")
result: String => Unit = <function1>

scala>    result("good!")
java, HI : good!

当函数的返回类型是函数的时候,这个时候就表明Scala的函数实现了闭包
Scala闭包的内幕是:
Scala的函数背后是类和对象,所以Scala的参数都作为了对象的成员!
所以后续可以继续访问,这就是Scala 实现闭包的原理内幕!

Currying函数写法, 只要是复杂的Scala函数式编程代码就一定会使用这种写法:
funcResult(“Hello”)(“Java”)
Currying在复杂的函数式编程中经常使用,可以维护变量在内存中的状态,且实现返回函数的链式功能,可以实现非常复杂的算法和逻辑;


本博声明:
博文内容源自DT大数据梦工厂大数据Spark“蘑菇云”前置课程。相关课程内容视频可以参考:
百度网盘链接:http://pan.baidu.com/s/1cFqjQu(如果链接失效或需要后续的更多资源,请联系QQ460507491或者微信号:DT1219477246 获取上述资料,或者直接拨打 18610086859咨询)。

第12课:Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏

Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏...
  • w517424787
  • w517424787
  • 2016年08月01日 17:04
  • 471

!!scala 【经典】一步一步推导!!高阶函数,类型推断

--函数返回函数 scala> def fun1(name1:String) = (name2:String) => println(name1+" "+name2) fun1: (name1: St...
  • gdmzlhj1
  • gdmzlhj1
  • 2016年03月01日 14:25
  • 598

大数据Spark “蘑菇云”行动前传第12课:Scala函数式编程进阶与Spark源码鉴赏

大数据Spark “蘑菇云”行动前传第12课:Scala函数式编程进阶与Spark源码鉴赏   1 Spark源代码中 Scala函数式编程 2 Scala函数式编程实战       ...
  • duan_zhihua
  • duan_zhihua
  • 2016年07月31日 21:18
  • 307

大数据Spark “蘑菇云”行动第50课程 Spark 2.0项目概述 项目!!!大项目!!!超大型大数据项目!!!

大数据Spark “蘑菇云”行动第50课程 Spark 2.0项目概述 从9月20号的大数据项目课程内容开始,所有的同学每节课必须按照课程内容动手实战,且基于课程内容写项目的学习博客; 第一步: 需求...
  • duan_zhihua
  • duan_zhihua
  • 2016年09月20日 21:20
  • 763

大数据Spark “蘑菇云”行动第81课:Spark GraphX 综合案例作业讲解和源码深度剖析

大数据Spark “蘑菇云”行动第81课:Spark GraphX 综合案例作业讲解和源码深度剖析   聚合操作是分布式系统中最重要的操作   which fields should be inc...
  • duan_zhihua
  • duan_zhihua
  • 2016年11月17日 21:04
  • 507

Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏

Spark源码中的Scala类函数式编程 函数是第一等公民,在Spark源码中函数随处可见。 函数可赋值给变量,同理变量也可赋值给函数。 RDD.scala 1 def map[U:...
  • accptanggang
  • accptanggang
  • 2016年08月03日 15:00
  • 242

大数据Spark “蘑菇云”行动补充内容第69课: Spark SQL案例之分析电影评分系统.

大数据Spark “蘑菇云”行动补充内容第69课: Spark SQL案例之分析电影评分系统. 昨天的作业dataframe的 算子实现 : import org.apache.spark.sql.t...
  • duan_zhihua
  • duan_zhihua
  • 2016年10月29日 20:51
  • 584

大数据DTSpark"蘑菇云"行动之 第一课:Scala语言开发环境搭建

大数据DTSpark”蘑菇云”行动学习之路第一课——Scala语言开发环境搭建  第一次听王家林老师的课,感觉很不错,特别是家林老师对技术的那种热情深深的感染了我。希望在以后的日子学有所成,在此非常感...
  • myszmail
  • myszmail
  • 2016年08月04日 23:11
  • 249

第12节:Scala函数式编程进阶(匿名函数,高阶函数,函数类型推断,currying柯里化)

package basics object fuctionalPrograming { def main(args: Array[String]): Unit = { //1.函数和变...
  • u012036736
  • u012036736
  • 2017年11月12日 23:38
  • 54

大数据Spark “蘑菇云”行动前传Scala专家之路第26课:Scala的核心力量和黄金定律

大数据Spark “蘑菇云”行动前传Scala专家之路第26课:Scala的核心力量和黄金定律 1 scala的核心力量 2 scala的黄金定律...
  • duan_zhihua
  • duan_zhihua
  • 2016年08月17日 21:32
  • 413
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:大数据Spark“蘑菇云”行动-第12课:Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏
举报原因:
原因补充:

(最多只允许输入30个字)