Scala 箭头函数 => By-Name Parameters

Scala 中允许使用高阶函数, 高阶函数可以使用其他函数作为参数,或者使用函数作为输出结果。通常情况下,函数的参数是传值参数;即参数的值在它被传递给函数之前被确定。但是,如果我们需要编写一个接收参数不希望马上计算,直到调用函数内的表达式才进行真正的计算的函数。对于这种情况,Scala提供按名称参数调用函数。

闲话少说,先撸代码:

object Tests {
  def main(args: Array[String]): Unit = {
    val a = stepOne(param())
    println(s"stepOne 返回的结果: --> ${a}")

  }
  def param(): Long ={
    println("进入param函数!每次调用都触发")
    System.nanoTime()
  }

  def stepOne(x: => Long): Long ={
    println("进入函数stepOne!")
    println(s"先调用参数x --> ${x} 打印出来")
    x
  }
}
Scala箭头函数 By-Name Parameters

从上图中我们看出来整个代码的执行顺序。在代码中,如果定义函数的时候,传入参数不是传入的值,而是传入的参数名称(如代码中使用x: => Long而不是x: Long),在调用该函数时,不会立即执行和参数有关的计算,而是到参数真正使用到的时候才进行计算。

使用“按名称传递参数”方式的优点是:1.减少不必要的计算; 2.减少异常。

发表回复