大数据Spark“蘑菇云”行动-第12课:Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏
来源:互联网 发布:信阳烟草网络 编辑:程序博客网 时间:2024/05/01 12:46
一言不合直接看代码:
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)Unitscala> 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)Unitscala> getName(f,"Scala")Hi ,Scala
以上示例,极大的简化的编程的语法:
第一:以前Java的方式是new出一个接口实例,并且在接口实例的回调方法callback中来实现业务逻辑,现在是直接把回调方法callback传递给我的函数,且在函数体中直接使用,这毫无疑问的简化的代码的编写,提升了开发效率;
第二:这种方式非常方便编写负责的业务逻辑和控制逻辑,对于图计算、机器学习、深度学习等而言至关重要;
函数作为函数的参数传递的编程方式是称之为高阶函数的编程方式,Spark源码和应用程序开发中至少60%都是这种代码,必须务必一定要掌握。
下面是Array自带的map和foreach方法,把函数作为参数传递的示例:
scala> Array(1 to 10: _*).foreach{x=>println(x)}12345678910scala> Array(1 to 10: _*).map{(i:Int) => 2* i}.foreach{x=>println(x)}2468101214161820
4、函数式编程,函数的返回值可以是函数。
scala> def funcResult = (name: String) => println( "HI : " + name)funcResult: String => Unitscala> funcResult("java")HI : javascala> def funcResult(msg:String) = (name: String) => println(msg+ ", HI : " + name)funcResult: (msg: String)String => Unitscala> funcResult("java")res7: String => Unit = <function1>scala> res7("good")java, HI : goodscala> 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咨询)。
- 大数据Spark“蘑菇云”行动-第12课:Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏
- 第12课:Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏
- Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏
- 大数据Spark “蘑菇云”行动前传第12课:Scala函数式编程进阶与Spark源码鉴赏
- 大数据Spark“蘑菇云”行动-第14课Scala集合上的函数式编程实战及Spark源码鉴赏
- 第12节:Scala函数式编程进阶(匿名函数,高阶函数,函数类型推断,currying柯里化)
- 大数据Spark “蘑菇云”行动前传第14课Scala集合上的函数式编程实战及Spark源码鉴赏
- 大数据Spark “蘑菇云”行动前传第22课:Scala集合和高级函数操作实战及Spark源码鉴赏.
- 大数据spark蘑菇云行动前传第5课:零基础彻底实战Scala函数式编程及Spark源码解析
- 大数据Spark “蘑菇云”行动前传第5课:零基础实战Scala函数式编程及Spark源码解析
- 大数据Spark “蘑菇云”行动前传18课:Scala偏函数、异常、Lazy值编码实战及Spark源码鉴赏
- 大数据Spark“蘑菇云”行动-第10课:Scala继承彻底实战和Spark源码鉴赏
- 大数据Spark“蘑菇云”行动-第13课Scala模式匹配实战和Spark源码鉴赏
- 大数据Spark“蘑菇云”行动-第11课:Scala面向接口彻底实战和Spark源码鉴赏
- 大数据Spark “蘑菇云”行动前传第10课:Scala继承彻底实战和Spark源码鉴赏.
- 大数据Spark “蘑菇云”行动前传第13课Scala模式匹配实战和Spark源码鉴赏
- 大数据Spark “蘑菇云”行动前传第16课:Scala implicits编程彻底实战及Spark源码鉴赏
- 第14课Scala集合上的函数式编程实战及Spark源码鉴赏
- 建议5: 使用int?来确保值类型也可以为null
- 网址
- printk_time
- 167. Two Sum II - Input array is sorted
- JavaSE Swing Menu
- 大数据Spark“蘑菇云”行动-第12课:Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏
- awk按照某个字段排列,求某个列的最大值最小值
- 中文分词比较困难的句子
- *浙大PAT甲级 1081
- memcache集群的安装和配置
- pdf文件太大?看pdf压缩大小的方法吧
- android 介绍Retrofit的简单使用
- U盘安装win7+linux(centos)双系统详细教程
- 引入css的方法有哪些? 不仅仅是外部引用,内部引用,等