大家好,我是楚生辉,在未来的日子里我们一起来学习大数据相关的技术,一起努力奋斗,遇见更好的自己!
本文详细的介绍了
scala的控制抽象
,有需要的小伙伴可以学习~
在Scala中,有一个特别有趣的现象,针对函数的参数,一个比较有趣的现象,用一段代码去代替函数中的参数,参数每使用一次,就会执行那一段代码
2.控制抽象控制抽象分别为值调用与名调用
2.1 值调用把计算后的值传递过去
def main(args: Array[String]): Unit = {
// 传值参数
def f0(a: Int): Unit = {
println("a" + a)
}
def f1() :Int = {
println("f1调用")
12
}
// f1()调用后返回12,12当作f0的参数
f0(f1())
}
2.2 名调用
把代码传递过去,因为是代码块,不像函数那样有参数,代码块只有返回值,因此
=>
前面是空的,遇到一个a就执行一次代码块
object TestControl {
def main(args: Array[String]): Unit = {
def f1() :Int = {
println("f1调用")
12
}
foo(f1())
}
// 传入一个代码块作为a,代码块的返回值必须为Int,a每使用一次就会执行一下代码块
def foo(a: =>Int):Unit = { //注意这里变量 a 没有小括号了
println(a)
println(a)
}
}
输出结果:
f...
10
f...
10
注意:Java 只有值调用;Scala 既有值调用,又有名调用。
3.案例实 *** 3.1 入门案例object TestFunction {
def main(args: Array[String]): Unit = {
// (1)传递代码块
foo({
println("aaa")
})
// (2)小括号可以省略
foo{
println("aaa")
}
}
def foo(a: =>Unit):Unit = {
println(a)
println(a)
}
}
3.2 自定义While 关键字实现循环功能
object TestFunction {
def main(args: Array[String]): Unit = {
var i: Int = 1
myWhile(i <= 10) {
println(i)
i += 1
}
}
def myWhile(condition: => Boolean): (=> Unit) => Unit = {
// 内层函数可以递归调用,参数就是循环体
def doLoop(op: => Unit): Unit = {
if (condition) {
op
myWhile(condition)(op)
}
}
doLoop _
}
}
解释:每遇到一次condition就会执行 i<=10的判断,返回Boolean类型的结果
用匿名函数闭包柯里化简化后的代码如下
object TestFunction {
def main(args: Array[String]): Unit = {
var i:Int = 1
myWhile(i <= 10){
println(i)
i +=1
}
}
def myWhile(condition: =>Boolean)(op: =>Unit):Unit={
if (condition){
op
myWhile(condition)(op)
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)