3.1 函数与方法的定义和区别
Scala中方法与java中类似,在类中进行定义,是类的一部分,有参数有返回值。
函数在Scala中是一个对象(继承自Trait类),能够作为变量也能传递给其他函数。
Scala 中使用val可以等于一个函数,使用def定义一个方法。
函数不可以重载,方法可以重载
函数和方法在使用上略有区别
函数定义
def 方法/函数[([参数:c参数类型])][:返回值类型][=]{
代码
返回值
}
// 例
def max(a:Int,b:Int):Int{
if(a>=b)
a
else
b
}
//调用
val n = max(4,6)
// fun1 与 fun2 的写法不推荐
def fun1 = {
print("hello")
}
def fun2 {
print("hello")
}
val fun3 = {
printf("fun3")
}
//在使用val时 不能省略(),否则类似于一个代码块,在运行时能够不调用就能执行。 当无参无返回值时,使用函数或者方法时带上括号。
val fun4(a:Int) = {
// 这是一种错误的写法。也就是说val不能定义一个函数,而是等于一个函数。
}
当定义时不加括号时,调用时也不能带括号(推荐带括号)
3. 2 函数参数的介绍
- 定长参数:(参数:类型,参数:类型……)
def fun(a:Int,b:Int,c:Int……) = {
}
- 可变长参数:(参数:类型*)
def sum(num:Int*) = {
var res = 0
for(a <- num){
res+=a
}
print(res)
}
sum(1,3,5,7)
//输出结果为16
- 默认参数
def add(a:Int=1,b:Double=2)={
a+b
}
add() // 不输入任何参数,输出结果为3.0
add(3) // 按从左到右顺序给参数赋值 输出结果为5.0
add(b=3) // 按照参数名称给参数赋值 输出结果为4.0
通常情况下可使用默认参数来避免主方法内函数的重载问题。
注意点:在默认参数与非默认参数一起使用时,普通参数在前,默认参数在后,避免出现赋值顺序不对。
3.3 匿名函数
函数可以不被命名。
// 匿名函数的定义:
(参数:参数列表) =>{代码}
val n =(参数:参数列表) =>{代码}
def fun=(参数:参数列表) =>{代码}
控制台测试:
应用:
val max = (x:Int,y:Int) =>{
if(x>y) x else y
}
print(max(5,7))
3. 4 函数的柯里化(Curring)
输入的参数是一个一个的括号,而不是在一个括号内.即(a)(b)=(a,b)
//例:
def fun(a:Int,b:Int)= a+b
def fun1(a:Int)(b:Int) = a+b
print(fun(1,2)+" "+fun1(1)(2))//输出结果一模一样。```
fun1与fun2是等价的。(fun2使用了高阶函数)
def fun2(a:Int) = {
(b:Int) => a+b
}
print(fun2(1)(2))
应用:隐式转换,高阶函数
3. 5 闭包
闭包是一个函数,返回值依赖于函数体以外的变量
val a = 1
def add(b:Int)={
a+b
}
3. 6 高阶函数
返回值是函数或参数是函数的函数
- 参数是一个函数
def fun(fun1:(Int,Int)=>Int)={
print(fun1)
}
def add(a:Int,b:Int)={
a+b
}
fun(add)
//或者直接使用匿名函数
def fun2((a:Int,b:Int)=>a+b)={}
//此时fun和fun2都是高阶函数
- 返回值是一个函数
def fun2(a: Int) = {
def fun3(b: Int) = {
a + b
}
fun3 _ //_的作用是阻断函数的运行,作为一个对象返回
}
print(fun2(1)(2))//输出结果为3
def fun2(a: Int) = {
fun3 _
}
def fun3(b: Int) = {}
//这种写法也可以
高阶函数的应用:map,reduce,filter,foreach,flatmap(后面再总结用法)等等;
注意:函数如果指定了return关键字来进行返回,那么返回值类型不能省略,
如果返回值类型是Unit,则有无return关键字的返回值为()