您的位置:首页 > 其它

Scala学习笔记三高阶函数

2018-12-02 00:27 85 查看

**

摘要:

**
去年开发的过程中使用过Kafka,了解到Kafka是用Scala编写的,今年在开发过程中,使用了spark,spark也是使用Scala编写的,并且在项目中使用了Scala开发,只是对Scala缺乏一个系统的学习,所以花了一个多月的时间看完了《快学Scala》,看完之后本来想写点摘要笔记,过程当中顺带看了慕课网Scala程序设计—基础篇,发现慕课网的基础讲解挺不错的,所以就把慕课网的讲解结合了个人的理解记录下来,慕课网的基础篇确实讲解的是基础,建议大家抽空看一下《快学Scala》,书本把原理的东西,以及Scala的很多概念讲解得更加详细

**

一.高阶函数

**
1.函数是第一等公民
Scala语言支持:把函数作为实参传递给另外一个函数,把函数作为返回值,
把函数赋值给变量,把函数存储在数据结构里
在Scala中,函数就像普通变量一样,同样也具有函数的类型
2.函数类型
在Scala中,函数类型的格式为 A =>B,表示一个接受类型A的参数,并返回类型B的函数
例子:
Int => String 是把整形映射为字符串的函数类型
3.高阶函数
用函数作为形参或返回值的函数,称为高阶函数换句话说函数的参数是函数,或者函数的返回值是函数,或者两者都有
例子:
def operator(f:(Int,Int)=>Int)={ // 函数的参数是函数
f(4,4)
}

def greeting() = (name:String) => {“hello” + " " + name}
//函数的返回值是函数,这里返回的是是匿名函数

4.匿名函数
匿名函数(Anonymous Function),就是函数常量,也称为函数文字量(Function Literal)
,换句话说就是没有函数头部分的变量,在Scala 里,匿名函数的定义格式为
(形参列表) = > {函数体}
例子: (x:Int,y:Int)=> x+y
5.柯里化
柯里化函数(Curried Function)把具有多个函数的参数转换为一条函数链,每个节点上是单一函数。换句话说就是把多个参数转换成单个参数,把多个参数单个的拿出来,放进括号里面,串接起来
def add(x:Int,y:Int)=x+y
def add(x:Int)(y:Int)=x+y //scala柯里化的语法
例子:def curiedAdd(a:Int)(b:Int) = a + b
curriedAdd(2)(2)//4
val addOne = curriedAdd(1)_ //Int = > Int
//这里将curriedAdd(a:Int)(b:Int) 变成了curriedAdd(1)(b:Int) 返回给addOne ,
//即addOne =curriedAdd(1)(b:Int)=1 + b
addOne(2) //3 ,传值b=2进addOne
6.递归函数
递归函数(Recursive Function)在函数式编程中是实现循环的一种技术
例子:计算n!
def factorial(n:Int) : Int=
if(n<=0) 1
else nfactorial(n-1)
为了解决递归中可能会出现的堆栈溢出,进行优化,出现了以下:
尾递归函数(tail Recursive Function)中所有递归形式的调用都出现在函数的末尾
当编译器检测到一个函数调用是尾递归的时候,它就覆盖当前的活动记录而不是在栈中去创建一个新的。
尾递归实现n!
@annotation.tailrec
def function(n:Int,m:Int):Int =
if(n<=0) m
else factotial(n-1,mn)
调用factorial(5,1)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: