概述
控制抽象有两种:
1. 值调用: 将函数计算后的值进行传递
2. 名调用: 传递的是代码块
注意:Java只有值调用;Scala既有值调用,又有名调用。
值调用
值调用 将函数计算后的值进行传递
def foo(a:Int):Unit={
println(a)
println(a)
}
def f(): Int = {
println("f...")
10
}
// 把f() 函数执行一下,然后将f()执行的结果传递给foo()函数
foo(f())
/* 输出: f...
10
10
*/
名调用
名调用 传递的是代码块
使用场景就是将不同的业务封装到代码块儿里面,传递给函数来使用.
// 函数: 参数类型=>返回值,
// 代码块: =>返回值类型
//下面写法是参数里面是 返回值为int类型的代码块儿
def foo(a : =>Int):Unit={
println(a)
println(a)
}
def f(): Int = {
println("f...")
10
}
//执行foo函数,传递的参数是 f()代码块儿,所以f()代码块儿被执行了两次
foo(f)
/* 输出: f...
10
f...
10
*/
案例2:
执行f1函数,然后传递一个代码块儿,
先执行代码块儿的内容,执行完了之后再将接口赋值给f1里面名字为ss的形参,最后执行f1函数.
def f1(ss: => String): Unit = {
println(ss)
}
//调用f1函数,传递一个代码块儿
f1(
{
println("我是f1代码块儿")
"jingjing"
}
)
}
/*输出: 我是f1代码块儿
jingjing */