函数式编程基础
1、在scala中,方法和函数几乎可以等同,只是函数的使用方式更加的灵活多样 [方法转函数]。
函数式编程充分利用函数、 支持的函数的多种使用方式。
函数是一等公民,像变量一样,既可以作为函数的参数使用,也可以将函数赋值给一个变量. ,函数的创建不用依赖于类或者对象。
2、函数/方法的定义
def 函数名 ([参数名: 参数类型], ...)[[: 返回值类型] =]
{ 语句... //完成某个功能
return 返回值 }
返回值解析:
: 数据类型 = ,表示返回值确定,清晰
= ,有返回值, 类型是推断出来的
无,无返回值 Unit
如果没有return ,默认以执行到最后一行的结果作为返回值
3、细节讨论
函数的形参列表可以是多个, 如果函数没有形参,调用时 可以不带()
Scala中的函数可以根据函数体最后一行代码自行推断函数返回值类型。那么在这种情况下,return关键字可以省略
如果函数明确使用return关键字,那么函数返回就不能使用自行推断了,这时要明确写成 : 返回类型 =
如果函数明确声明无返回值(声明Unit),那么函数体中即使使用return关键字也不会有返回值
Scala语法中任何的语法结构都可以嵌套其他语法结构
递归函数未执行之前是无法推断出来结果类型,在使用时必须有明确的返回值类型
4、可变参数
/支持0到多个参数 def sum(args: Int*) : Int = { }
//支持1到多个参数 def sum(n1: Int, args: Int*) : Int = { }
5、方法转函数
def f1(): Int = {100}
var f3 = f1 _
// 如果要打印f3函数的返回值 println(f3())
6、匿名函数
Val f4 = (a: String, b:Double) => a.toInt + b.toInt
蓝色部分是匿名函数,匿名函数的返回类型是通过函数推倒完成的,如果函数体有多行,用{},f4表示指向匿名函数的变量
7、作为参数的函数
def and(x: () => Boolean, y: () => Boolean) = x() && y()
其中,() => Boolean
等价于Function0[Boolean](函数类型)
,表示参数列表为空,返回值为Boolean
的函数类型。x也相当于是函数变量名。现在()可以省略。
def test2(a: => Int) =
{ println(a) println(a) }
该方法在方法变量名和参数变量返回类型之间使用 => 符号来设置传名调用。之后直接传递函数名。
注意:每次使用传名调用时,解释器都会计算一次表达式的值
在scala中函数也有类型
8、高阶函数
将其他函数作为参数或返回值为一个函数的函数
9、闭包
闭包就是一个函数与其相关的引用环境组合的一个整体
10、函数柯里化
柯里化指的是将原来接受多个参数的函数变成新的接受一个参数的函数的过程
11、参数(类型)推断
参数类型是可以推断时,可以省略参数类型
当传入的函数,只有单个参数时,可以省略括号
如果变量只在=>右边只出现一次,可以用_替代
12、惰性函数
将耗时的计算推迟到绝对需要的时候。
13、偏函数
在对符合某个条件,而不是所有情况进行逻辑操作时,使用偏函数是一个不错的选择
将包在大括号内的一组case语句封装为函数,我们称之为偏函数,它只对会作用于指定类型的参数或指定范围值的参数实施计算,超出范围的值会忽略.
偏函数在Scala中是一个特质PartialFunction