1.1 高阶函数
1.函数可以作为值进行传递
// 函数的返回值作为参数进行传递object Test03_Demo {def main(args: Array[String]): Unit = {val f = foo()println(f)}def foo():String = {"test"}}//下划线 _ 将函数当成一个整体传递给变量object Test03_Demo {def main(args: Array[String]): Unit = {val f2 = foo _println(f2())}def foo():String = {"test"}}//如果变量明确类型,函数可以直接赋值给变量object Test03_Demo {def main(args: Array[String]): Unit = {val f3:()=>String = fooprintln(f3)}def foo():String = {"test"}}
2.函数可以作为参数进行传递
object Test04_Demo {def main(args: Array[String]): Unit = {def f1(a:Int,b:Int,f:(Int,Int)=>Int):Int ={f(a,b)}println(f1(3,2, (c, d) => {c + d}))}}
3.函数可以作为函数返回值返回
object Test05_Demo {def main(args: Array[String]): Unit = {def f1():() => String={def f2()={"f2"}f2}val str :()=> String = f1()println(str())}}
1.2 匿名函数
1.没有名字的函数就是匿名函数
(x:Int)=> { 函数体 }
x => { 函数体 }
1.3 函数柯里化 & 闭包
闭包:一个内部函数,访问了外部函数的局部变量,那么这个函数和他所处的环境,称为闭包
def f1()={var a = 10def f2(b:Int)={a+b}f2 _}//在调用时,f1函数执行完毕后,局部变量a应该随着栈空间释放掉val f = f1()//但是此处,变量a其实并没有释放,而是包含在了f2函数内部,形成了闭合的效果println(f(3))
函数柯里化:把一个参数列表的多个参数,变成多个参数列表
// 函数柯里化一定存在闭包def f3()(b:Int) = {2+b}println(f3()(3))
1.4 递归
def ti(n : Int):Int = {if ( n == 1 || n == 0){1}return (n-1)+(n-2)}println(ti(1))
1.5 控制抽象
值调用:把计算后的值传递过去
def f = () => {10}foo(f())def foo(a:Int)={println(a)}
名调用:把代码传递过去
def f = ()=>{println("f....")10}def ff(f1: =>Int): Unit ={println(f1)println(f1)}ff(f())

1.6 懒加载
函数的返回值由一个变量接收,被lazy修饰 当第一次用到的时候 函数才会被执行
def add(a:Int, b:Int):Int{a+b}lazy val res = add(1,2)println(val)//此时才会调用add
1.7 总结
柯里化&闭包 自制while循环
var a = 10while (a > 0){println(a)a -= 1}
def mywhile(condition: =>Boolean) :(=>Unit)=>Unit={def doloop(op: => Unit): Unit={if(condition){opmywhile(condition)(op)}}doloop _}var a = 9mywhile(a > 0){ //因为是代码块所以可以省略 括号println(a)a -= 1}
