23.大数据学习之旅——scala进阶

本文深入探讨了函数式编程的概念,包括命令式编程与函数式编程的区别,以及函数式编程的优势。介绍了Scala的高阶函数、惰性求值和柯里化,并通过示例展示了如何在Scala中实现这些概念。此外,文章还讨论了Scala的集合库,包括不可变和可变集合,以及如何使用Map、Set和Tuple。最后,讲解了元组、高阶函数的应用场景,如单词统计,并探讨了Scala中的类、单例对象、抽象类、多态、特质和泛型等面向对象概念,以及`Option`的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数式编程的概念


编程范式
函数式编程是一种编程范式,我们常见的编程范式有:
1)命令式编程(Imperative programming),常见的面向对象编程是也是一种命令式编
程。比如java,c等。
命令式编程是完全依托于冯诺依曼体系机来实现的,即代码最后会转变为一条条的指令去执
行,所以指令式编程的时间复杂度是和指令数相关的。根据摩尔定律,冯诺依曼体系机的性能
可能本世纪30年代就不再提高,即当冯诺依曼体系机被淘汰时,指令式编程可能也会被淘汰。
现在有一个名字就是:冯诺依曼瓶颈,即内存的速度跟不上cpu处理速度。IBM TrueNorth。
2)函数式编程,从理论上来说,函数编程是不依托于指令架构的,因为函数式编程是建立主
体和主体之间的映射关系。但是目前从实际情况来开,函数式编程还是需要转变为指令去运行
的。
函数式编程语言:HasKell,K#,Lisp
3)逻辑式编程,最常用的逻辑编程语言是Prolog,另外有较适用于大型方案的Mercury。
函数式编程
在函数式语言中,函数作为一等公民,可以在任何地方定义,在函数内或函数外,可以作为函
数的参数和返回值,可以对函数进行组合。这个概念就是——高阶函数,高阶函数就是参数
为函数或返回值为函数的函数。有了高阶函数,就可以将复用的粒度降低到函数级别,相对于
面向对象语言,复用的粒度更低。
此外,函数式语言通常提供非常强大的集合类(Collection),提供很多高阶函数,因此使用
非常方便。
函数式编程语言还提供惰性求值(Lazy evaluation,也称作call-by-need),是在将表达式
赋值给变量(或称作绑定)时并不计算表达式的值,而在变量第一次被使用时才进行计算。这
样就可以通过避免不必要的求值提升性能。
纯函数式编程语言中的变量的值是不可变的(immutable),也就是说不允许像命令式编程
语言中那样多次给一个变量赋值。比如说在命令式编程语言我们写“x = x + 1”,这依赖可
变状态的事实,拿给程序员看说是对的,但拿给数学家看,却被认为这个等式为假。

懒值 Lazy
在这里插入图片描述

柯里化 Currying
scala的柯里化的作用是结合scala的高阶函数,从而允许用户自建立控制结构。
柯里化(Currying)技术Christopher Strachey 以逻辑学家 Haskell Curry 命名的(尽管它是Moses
Schnfinkel 和 Gottlob Frege 发明的)。它是把接受多个参数的函数变换成接受一个单一参数的函数,
并且返回接受余下的参数且返回结果的新函数的技术。
案例1:
object Demo08 {
def main(args: Array[String]): Unit = {
//首先我们定义一个函数:
def f1(a:Int,b:Int):Int={a+b}
//现在我们把这个函数变一下形:
def f2(a:Int)(b:Int)={a+b}
//那么我们应用的时候,应该是这样用:f2(2)(3),最后结果都一样是5,这种方式(过程)就叫柯里
化。
val r1=f2(2)(3)
//柯里化实质上会演变成这样一个函数:
//接收一个参数a,返回一个匿名函数,
//该匿名函数又接收一个参数b,函数体为a+b
def f3(a:Int)=(b:Int)=>a+b
val f4=f3(2)
//请思考f4(3)的值是多少?答案是:5
f4(3)
}
}
示例2:
object Demo09 {
def f1(a:Int,b:Int,c:Int):Int={a+b+c}
def f2(a:Int)(b:Int)(c:Int):Int={a+b+c}
def f3(a:Int)(b:Int,c:Int):Int={a+b+c}
def f4(a:Int,b:Int)(c:Int):Int={a+b+c}
def main(args: Array[String]): Unit = {
//f1和f2的函数的体现的是传入三个数,马上得到结果
f1(1,2,3)
f2(1)(2)(3)
//f3函数则可以体现:延迟执行的思想以及固定易变因素的思想
val r1=f3(1)(2,3)
}
}
示例3:
object Demo10 {
def f1(a:Int,b:Int,f:(Int,Int)=>Int):Int={f(a,b)}
def f2(a:Int)(b:Int)(f:(Int,Int)=>Int):Int={f(a,b)}
def f3(a:Int,b:Int)(f:(Int,Int)=>Int):Int={f(a,b)}
def f4(a:Int)(b:Int,f:(Int,Int)=>Int):Int={f(a,b)}
def main(args: Array[String]): Unit = {
//调用f3
f3(2,3){(a:Int,b:Int)=>a+b}
//可简化为下面的形式,我们发现这和scala中很多函数的形式很相近,比如:for(x<-1 to 10){print()}
//所以,柯里化的另外一个作用是让用户灵活的自义定自建控制结构
f3(2,3){
+}
f3(2,3){
*_}
// 延迟处理思想
def f3(a:Int)=(b:Int)=>a+b
val f4=f3(2)
f4(3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值