1.传名调用
概述
当正真用到该函数的返回值的时候才会调该函数
实例
普通方式调用
代码
def main(args: Array[String]): Unit = {
f2(f1())
}
def f1(): Int ={
println("f1")
return 1
}
def f2(a:Int): Unit ={
println("f2")
println(a)
}
- 输出结果
输出结果:
f1
f2
1
- 结论 : 虽然没有用到值a,但是会先执行f1
传名调用
语法: 参数 : =>类型 注意冒号后面一定要有空格
代码
def main(args: Array[String]): Unit = {
f2(f1())
}
def f1(): Int ={
println("f1")
return 1
}
def f2(a: =>Int): Unit ={
println("f2")
println(a)
}
- 输出结果
f2
f1
1
- 结论 : 仅在使用到变量a的时候才会调用方法f1
2.指定参数名调用
概述
参数太多时记不住参数的顺序可以指定参数名称传值
示例
def f3(name:String,age:Int)={
println(name+age)
}
f3(age=10,name = "张三")
3.参数默认值
概述
给参数设置默认值,如果如果不传该参数就用默认值
示例
def f5(name:String="antg")={
println(name)
}
f5()
4.可变长参数
概述
当参数的数量不确定时,可以使用该技术
示例
def f4(str:String*): Unit ={
str.foreach(x=>println(x))
}
f4("1","2","3")
5.递归函数
概述
函数自己调用自己就是递归函数
注意两点
递归的终止条件
递归的公式
示例
def f6(n:Int):Int={
if(n==1){
return 1
}
n*f6(n-1)
}
println(f6(5))
6.高阶函数
概述
参数或者返回值是函数的函数既高阶函数
示例
//参数是函数的函数
def f7(f:(Int)=>Unit)={
f(10)
}
f7((x:Int)=>println(x))
//返回值是函数的函数
def f8(y:Int):(Int)=>Unit={
return (x:Int)=>println(x*y)
}
var f8r = f8(10)
f8r(2)
7.内嵌函数
概述
函数中可以再创建函数
示例
//内嵌函数
def f9()={
def f()={
println("这是一个内嵌函数")
}
f()
}
f9()
8.匿名函数
概述
没有名称的函数
使用 => 来分隔函数定义与函数体
示例
//匿名函数
val f10 = (x:String)=>println(x)
f10("123")
9.偏应用函数
概述
如果一个函数被调用多次且其中的一个变量不变,那么就可以使用偏应用函数
示例
//偏应用函数
def f11(name:String,hello:String)={
println(name+"--"+hello)
}
val f12 = f11("张三",_)
f12("早上好")
f12("中午好")
f12("晚上好")
10.函数柯里化
概述
在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。
简单来说柯里化就是固定某些参数,然后返回一个仅有一个参数的函数的计算机技术
示例
//函数柯里化
//传统add的方法的实现
def f13(a:Int,b:Int)={
println(a+b)
}
f13(10,20)
//柯里化实现
def f14(a:Int)=(b:Int)=>println(a+b)
def f15(a:Int)(b:Int)=println(a+b)
//使用
val f16 = f14(3)
f16(4)
f16(5)
f16(6)
var f17 = f15(3)(_)
f17(4)
f17(5)
f17(6)