函数式编程
方法就是函数,函数也是对象
1、方法
1、语法:
def 方法名(参数名:参数类型,…):返回值类型 = {方法体}
def add(x:Int,y:Int):Int= {x+y}
2、方法的简化
1、如果方法体只有一行语句,此时方法体的{}可以省略<br />
def add(x:Int,y:Int):Int= x+y
2、如果将方法体块表达式的结果值作为方法的返回值,此时定义方法的时候方法的返回值类型可以省略<br /> 如果方法体中有return关键字不能省略方法的返回值类型<br /> def add(x:Int,y:Int)= x+y<br /> 3、如果方法不需要返回值的时候,=可以省略[=与{}不能同时省略]<br />
def hello():Unit = {println("..")}
简化:
def hello(){println("..")}
4、如果方法不需要参数的时候,()可以省略
def hello{println("..")}
1、如果定义方法的时候没有(),在调用方法的时候()不能带上<br /> 2、如果定义方法的时候有(),在调用方法的时候()可有可无
3、方法参数
1、默认值参数: 调用方法的时候有默认值的参数可以不用传值<br /> 语法: def 方法名(参数名:参数类型=默认值,...):返回值类型 = {方法体}<br /> 有默认值的参数最好放在参数列表最后面<br /> 2、带名参数: 调用方法的时候指定将值传递给哪个参数<br />
def add(x:Int=10,y:Int) = x+y
调用:
add(y=20)
3、可变参数:
语法: def 方法名(参数名:类型,..,参数名:参数类型):返回值类型 = {方法体}
注意: 可变参数必须放在参数列表最后面
java中可变参数可以直接传递数组,
scala可变参数不能直接将数组传入,如果想要将数组/集合的所有元素传递给可变参数,应该通过 集合名:_ 的方式传递
2、函数
1、语法:
val 函数名 = (参数名:类型,..) => {函数体}
函数是一个对象
2、函数的简化:
3、方法和函数的区别
区别:
1、方法是存储在方法区中,函数是对象是存在堆中
2、方法如果定义在object/class中可以重载的,函数是对象,函数名就是变量名,函数不能重载[同一个作用域不能有同名参数]
联系:
1、方法可以手动转成函数: 方法名 _
2、方法如果定义在方法中,此时就是函数
4、高阶函数
1、定义:
使用函数作为参数或者是返回值的方法/函数称之为高阶函数
def add(x:Int,y:Int,func:(Int,Int)=>Int):Int = { func(x,y) }
2、调用高阶函数的简化
val func = (x:Int,y:Int) => x+y
add(10,20,func)
1、直接传递函数的值:
add(10,20,(x:Int,y:Int) => x+y)
2、函数的参数类型可以省略:
add(10,20,(x,y) => x+y)
3、如果函数的参数在函数体中只使用了一次,可以用_代替: add(10,20,_+_) [第N个下划线代表函数第N个参数]<br /> 注意: 以下三种情况不能用_代替<br /> 1、函数的参数的定义顺序与在函数体中使用顺序不一致的时候,不能用_代替:<br />
add(10,20,(x,y) => y-x)
不能简化为:
add(10,20,_-_)
2、如果函数体中存在嵌套[()],此时函数的参数在嵌套中以表达式的形式存在的时候,不能用_代替
add(10,20,(x,y) => (x+10)*y)
不能简化为:
add(10,20,(_+10)*_)
3、如果函数参数个数只有一个,并且在函数体中直接将参数返回,此时不能用_代替
def m1(x:Int,func: (Int) =>Int ) = func(x)
m1(10,x=>x)
不能简化为:
m1(10,_)
4、如果函数只有一个参数,那么定义函数的时候()可以省略
m1(10,(x)=>x) 简化为: m1(10,x=>x)