一.方法和函数
1.方法
1)基本语法
def 方法名(参数名:参数类型,...):返回值类型 = {方法体}
示例
def add(x: Int, y: Int): Int = {
x + y
}
2)简化原则
1、方法体中只有一行语句的时候,{ }可以省略
示例
def add(x: Int, y: Int): Int = x + y
2、如果将方法体中最后一行表达式作为方法的返回值,返回值类型可以省略
示例
def add(x: Int, y: Int) = {
x + y
}
注意
方法体中有return,必须定义方法的返回值类型
递归方法必须定义返回值类型
3、如果方法不需要返回值, =可以省略
示例
def func(x: Int) {
print(x)
}
4、如果方法不需要参数,()可以省略
示例
def func1 = {
print("hello world")
}
注意
如果定义方法的时候,没有(),在调用的时候也不能带上()
如果定义方法的时候有(),调用方法的时候()可有可无
=、()、{}不能够同时省略
3)方法参数
1.默认参数
在定义方法的时候,可以给参数一个默认值,后续在调用方法的时候,有默认值的参数就可以不用传参
示例
def add(y: Int,x: Int = 2, y: Int = 3) = {
x + y + z
}
//不赋值使用默认值
add(3)
2.带名参数
指定将值传递给哪个参数
add(x=3,y=4)
3.可变参数
定义func,address参数可变
def func(name:String,address:String*) ={
print(s"name:${name},address:${address}")
}
调用可以函数,不能直接传递数组,要通过 数组名:_* 的形式传递
val arr = List("北京市","丰台区","槐房村")
func("zhangsan",arr:_*)
add(x=3,y=4)
注意
可变参数必须放在参数列表的最后
可变参数不能与默认值、带名参数一起使用
2.函数
语法: val 函数名 = (参数名:参数类型,..) => {函数体}
简化: 函数体中只有一行语句的时候,{}可以省略
示例
val func = (x:Int,y:Int) => x+y
3.方法和函数的区别
1)方法可以重写,函数不可用重写
2)方法是存在于方法区,函数存在堆中
3)方法可以转成函数,函数不能转成方法。
方法转函数: 方法名 _
// add方法
def add(x: Int = 2, y: Int = 3) = {
x + y
}
//将add方法转fun函数
val fun = add _
但是在Scala中,函数和方法没有明确的界定:方法就是函数,函数也是对象
二.高阶函数
定义:方法/函数
的 参数/返回值
是一个函数
示例
def fun1(x:Int,y:Int,fun2:(Int,Int)=>Int) ={
fun2(x,y)
}
// 定义函数
val add = (x:Int,y:Int) => x+y
// 调用高阶函数fun1
println(fun1(1, 2, add))
三.匿名函数
定义:没有名字的函数,一般作为值进行传递
示例
def fun1(x:Int,y:Int,fun2:(Int,Int)=>Int) ={
fun2(x,y)
}
//_+_: 简写(x:Int,y:Int)=>(x=y)
fun1(1,2,_+_)
四.柯里化
定义: 有多组参数列表的方法称之为柯里化方法
示例
def m1(x:Int)(y:Int,z:Int) = x+y+z
演变过程
def fun1(x:Int):(Int,Int) => Int ={
(y:Int,z:Int) => x +y+z
}
fun1(1)(2,3)
五.闭包
定义: 函数体中使用不属于函数本身的变量,这样的函数称之为闭包
示例
val x = 10
val func = (y:Int) => x+y