1.1 高阶函数

1.函数可以作为值进行传递

  1. // 函数的返回值作为参数进行传递
  2. object Test03_Demo {
  3. def main(args: Array[String]): Unit = {
  4. val f = foo()
  5. println(f)
  6. }
  7. def foo():String = {
  8. "test"
  9. }
  10. }
  11. //下划线 _ 将函数当成一个整体传递给变量
  12. object Test03_Demo {
  13. def main(args: Array[String]): Unit = {
  14. val f2 = foo _
  15. println(f2())
  16. }
  17. def foo():String = {
  18. "test"
  19. }
  20. }
  21. //如果变量明确类型,函数可以直接赋值给变量
  22. object Test03_Demo {
  23. def main(args: Array[String]): Unit = {
  24. val f3:()=>String = foo
  25. println(f3)
  26. }
  27. def foo():String = {
  28. "test"
  29. }
  30. }

2.函数可以作为参数进行传递

  1. object Test04_Demo {
  2. def main(args: Array[String]): Unit = {
  3. def f1(a:Int,b:Int,f:(Int,Int)=>Int):Int ={
  4. f(a,b)
  5. }
  6. println(f1(3,2, (c, d) => {
  7. c + d
  8. }))
  9. }
  10. }

3.函数可以作为函数返回值返回

  1. object Test05_Demo {
  2. def main(args: Array[String]): Unit = {
  3. def f1():() => String={
  4. def f2()={
  5. "f2"
  6. }
  7. f2
  8. }
  9. val str :()=> String = f1()
  10. println(str())
  11. }
  12. }

1.2 匿名函数

1.没有名字的函数就是匿名函数

(x:Int)=> { 函数体 }
x => { 函数体 }

1.3 函数柯里化 & 闭包

闭包:一个内部函数,访问了外部函数的局部变量,那么这个函数和他所处的环境,称为闭包

  1. def f1()={
  2. var a = 10
  3. def f2(b:Int)={
  4. a+b
  5. }
  6. f2 _
  7. }
  8. //在调用时,f1函数执行完毕后,局部变量a应该随着栈空间释放掉
  9. val f = f1()
  10. //但是此处,变量a其实并没有释放,而是包含在了f2函数内部,形成了闭合的效果
  11. println(f(3))

函数柯里化:把一个参数列表的多个参数,变成多个参数列表

  1. // 函数柯里化一定存在闭包
  2. def f3()(b:Int) = {
  3. 2+b
  4. }
  5. println(f3()(3))

1.4 递归

  1. def ti(n : Int):Int = {
  2. if ( n == 1 || n == 0){
  3. 1
  4. }
  5. return (n-1)+(n-2)
  6. }
  7. println(ti(1))

1.5 控制抽象

值调用:把计算后的值传递过去

  1. def f = () => {
  2. 10
  3. }
  4. foo(f())
  5. def foo(a:Int)={
  6. println(a)
  7. }

名调用:把代码传递过去

  1. def f = ()=>{
  2. println("f....")
  3. 10
  4. }
  5. def ff(f1: =>Int): Unit ={
  6. println(f1)
  7. println(f1)
  8. }
  9. ff(f())

image.png

1.6 懒加载

函数的返回值由一个变量接收,被lazy修饰 当第一次用到的时候 函数才会被执行

  1. def add(a:Int, b:Int):Int{
  2. a+b
  3. }
  4. lazy val res = add(1,2)
  5. println(val)//此时才会调用add

1.7 总结

柯里化&闭包 自制while循环

  1. var a = 10
  2. while (a > 0){
  3. println(a)
  4. a -= 1
  5. }
  1. def mywhile(condition: =>Boolean) :(=>Unit)=>Unit={
  2. def doloop(op: => Unit): Unit={
  3. if(condition){
  4. op
  5. mywhile(condition)(op)
  6. }
  7. }
  8. doloop _
  9. }
  10. var a = 9
  11. mywhile(a > 0){ //因为是代码块所以可以省略 括号
  12. println(a)
  13. a -= 1
  14. }