Scala函数式编程基础
Scala函数式编程基础
函数式编程介绍
- 在scala中,方法和函数几乎可以等同(比如它们的定义、使用、运行机制都一样的),只是函数的使用方式更加灵活
- 函数式编程是从编程方式的角度来谈的,可以理解为:函数式编程把函数当作一等公民,充分利用函数、支持函数的多种使用方式。
比如:在Scala中,函数是一等公民,像变量一样,既可以作为函数的参数使用,也可以将函数赋值给一个变量,函数的创建不用依赖于类或者对象,而在java中,函数的创建则依赖于类,抽象类或者接口 - 面向对象编程是以对象为基础的编程方式
- 在scala中,函数式编程和面向对象编程融合在一起了
函数的定义
方法(需要通过对象调用):
def add(a: Int, b: Int): Int = { a+b } 最后一行执行代码即为返回值,在这里我们也可以不写返回值类型
(但是对于递归函数必须写出返回值类型)让编译器去自动判断
但是变量中类型是必须著名的,要不然再厉害的编译器也无法推断出来啊
方法转换成函数
add _ 输出:
(Int, Int) => Int =
(Int, Int):函数的参数列表
=>:函数的标识符
Int:函数的返回类型
function2:表示该函数有两个参数
函数(spark源码中有大量的函数)
函数一定有一个返回值的
定义一个匿名函数: (a: Int, b: Int) => {a+b}
val f1 = (a: Int, b: Int) => {执行逻辑}
val f2:(Int, Int) => Int = (a,b) => {a+b}
方法一:
val 函数名 = (函数的参数列表) => 函数体
方法二:
val 函数名 : (函数的参数类型列表) => 函数的返回值类型 = (函数的参数变量引用) => 函数体
函数-调用机制
def main(args: Array[String]): Unit = {
val n1: Int = 1
val n2: Int = 3
val res = sum(n1, n2)
println("res= " + res) //输出4
}
def sum(n1: Int, n2: Int): Int = n1 + n2

- 程序执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)
- 函数的局部变量时独立的,不会相互影响
- 递归必须向退出递归的条件逼近,否则就时无限递归了
- 当一个函数执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁
函数的参数
可变参数
java中String ... names 表示多个可变参数
scala中ints: Int* 表示多个可变参数
可变参数一般放在参数的末尾
def add2(initValue: Int, ints: Int* )
参数的默认值
def add(a: Int = 6, b: Int = 2)
add(b=6)
覆盖参数时,参数的名称必须和方法定义的名称保持一致
函数注意事项和细节讨论
1)函数的形参列表可以是多个,如果函数没有形参,调用时可以不带()
2)形参列表和返回值列表的数据类型可以是值类型和引用类型
3)scala中的函数可以根据函数体最后一行代码自行推断函数返回值类型。那么在这种情况下,return关键字可以省略
def sum(n1: Int, n2: Int): Int = n1 + n2
4)因为Scala可以自行推断类型,所以在省略return关键字的场合,返回值类型也可以省略
def sum(n1: Int, n2: Int) = n1 + n2
5)如果函数明确使用return关键字,那么函数返回就不能使用自行推断了,这时要明确写成 : 返回类型 = ,
6)如果函数明确声明无返回值(声明Unit),那么函数体中即使使用return关键字也不会有返回值
7)scala语法中任何的语法结构都可以嵌套其他语法结构(灵活),即:函数中可以再声明/定义函数,类中可以再声明类,方法中可以再声明/定义方法
8)在使用递归时,无法推断出结果类型,所以在定义时必须明确函数的返回值类型

浙公网安备 33010602011771号