大数据DTSpark"蘑菇云"行动之 第五课:零基础实战Scala函数式编程
2016-08-07 09:00
246 查看
大数据DTSpark”蘑菇云”行动之 第五课:零基础实战Scala函数式编程
在Scala中函数可以被简单的认为是包含一条或者多条语句的代码集合,可接若干参数,经代码集合处理后返回结果,形如数学中f(x)=x+1。在Scala中函数是一等公民,可以像变量一样被传递、被赋值。同时函数可以赋值给变量,变量也可赋值给函数,之所以可以这样,原因在于函数背后是类和对象,也就是说在运行时函数实质是一个变量。当然,背后的类是Scala语言自动生成的,且可以天然的被序列化和反序列化,这个意义非常重大。一、可以天然的序列化和反序列化的直接好处就是函数可以在分布式系统上传递。
二、由于函数背后实质是类和对象,因此函数可以和普通变量完全一样地应用在任何普通变量可以运用的地方,包括作为参数传递,作为返回值,被变量赋值和赋值给变量等。
补充:整个IT编程技术的发展史,其实就是一部封装史:
1,Function时代:在C语言中提供了函数的概念,用函数把若干条语句进行封装和复用;
2,Class时代:在C++和Java等语言中提供了类和兑现个,把数据和处理数据的业务逻辑封装起来;
3,框架时代:把数据、代码和驱动引擎封装起来,是过去10年和未来10年IT技术的核心
关于函数初级入门的几个要点:
1、def关键字来定义函数;
2、函数会自动进行类型推断来确定函数返回值的类型,如果函数名称和函数体之间没有等于号则类型推断失效,此时函数的类型是Unit;
3、函数的参数可以是函数;
4、如果在函数体中无法推导出函数的类型,则必须声明具体的类型,例如下面的fibonacci;
5、函数的参数可以有默认值,如果在调用函数时如果不想改变默认值的话就直接使用默认值即可,这在实际的编程中意义重大,尤其是在Spark等框架中,因为框架一般都有自己的默认配置和实现,此时可以非常好的使用默认值;
6、我们可以基于函数的参数名称来调整函数的传递参数的顺序,重点在于为什么可以这么做呢?原因在于函数背后其实是类,其参数就是类的成员,所以无所谓顺序;
7、函数中如果不确定传递参数的个数,可以使用变长参数的方式,传参时的一个方便语法是“: _*”
8、可变参数中的数据其实会被收集成为Array数组,我们在入口方面main中其实就是可变参数,是以Array[String]的方式呈现的;
以下是函数式编程的例子:
object HelloFunctionalProgramming {
def main(args: Array[String]): Unit = {
hello(“Spark”, 30)
println(hello(“Spark”, 30)) //函数的参数可以是函数
val result = fibonacci(5)
println(“fibonacci of 100 = ” + result)
hello("Scala") hello(age = 31, name = "dtspark") println("Sum = " + sum(1,2,3,4,5,6,7,8,9,10)) println("Sum = " + sum(1 to 100: _*)) println("sumrecursive = " + sum(1 to 100: _*))
}
def hello(name: String, age: Int = 30) = {
println(“Hello, my name is ” + name)
println(“Hello, my age is ” + age)
age
}
def fibonacci(n : Int):Int = {
if(n <= 1) 1
else fibonacci(n-2) + fibonacci(n-1)
}
def sum(numbers: Int*) = {
var result = 0
for(number <- numbers) result += number
result
}
def sumrecursive(numbers:Int*):Int = {
if(0 == numbers.length ) 0
else numbers.head + sumrecursive(numbers.tail: _*)
}
}
相关文章推荐
- 大数据DTSpark"蘑菇云"行动之 第四课:零基础彻底实战Scala控制结构
- 大数据DTSpark"蘑菇云"行动之 第六课:零基础实战Scala集合操作
- 大数据DTSpark"蘑菇云"行动之 第二课:Scala初体验
- 大数据DTSpark"蘑菇云"行动之 第三课:IDE开发第一个Scala程序
- 大数据DTSpark"蘑菇云"行动之 第一课:Scala语言开发环境搭建
- 大数据Spark “蘑菇云”行动前传第5课:零基础实战Scala函数式编程及Spark源码解析
- 大数据Spark “蘑菇云”行动前传第7课:零基础实战Scala面向对象编程及Spark源码解析
- 大数据Spark “蘑菇云”行动前传第8课:零基础实战Scala最常用数据结构Map和Tuple及Spark源码解析
- 大数据spark蘑菇云行动前传第5课:零基础彻底实战Scala函数式编程及Spark源码解析
- 大数据Spark “蘑菇云”行动前传第2课:Scala零基础实战入门的第一堂课及如何成为Scala高手
- 大数据Spark “蘑菇云”行动前传第4课:零基础彻底实战Scala控制结构及Spark源码解析
- Hadoop大数据零基础高端实战培训(新增)
- 美丽说基础数据建设迎来"数据仓库+"时代
- 【springmvc+mybatis项目实战】杰信商贸-18.附件分类基础表+数据字典
- Hadoop大数据零基础高端实战培训系列配文本挖掘项目
- Hadoop大数据零基础高端实战培训系列配文本挖掘项目
- Hadoop大数据零基础高端实战培训
- 大数据Spark “蘑菇云”行动前传第3课:在IDE下开发第一个Scala程序透彻解析及Scala控制结构详解实战
- MyBatis实战——前身iBatis、基础环境搭建和如何"钓鱼"
- Hadoop大数据零基础高端实战培训系列课程分享