概述

控制抽象有两种:

1. 值调用: 将函数计算后的值进行传递
2. 名调用: 传递的是代码块

注意:Java只有值调用;Scala既有值调用,又有名调用。

值调用

值调用 将函数计算后的值进行传递

  1. def foo(a:Int):Unit={
  2. println(a)
  3. println(a)
  4. }
  5. def f(): Int = {
  6. println("f...")
  7. 10
  8. }
  9. // 把f() 函数执行一下,然后将f()执行的结果传递给foo()函数
  10. foo(f())
  11. /* 输出: f...
  12. 10
  13. 10
  14. */

名调用

名调用 传递的是代码块

使用场景就是将不同的业务封装到代码块儿里面,传递给函数来使用.

// 函数: 参数类型=>返回值,
// 代码块:   =>返回值类型
        //下面写法是参数里面是 返回值为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 */