Scala 箭头符号使用场景 =>

我们在阅读或者使用Scala语言开发的程序或框架(如Spark)时经常会看到各种箭头符号,有的是单线箭头(-> | <-),而有的是等号箭头(=> ),还有的是双单线箭头(–>),这些符号在Scala的世界里被称为箭头函数,而且同一个箭头函数在不同的场景下是有不同的含义,不同的使用原则的。

本文主要先介绍下等号+方向符号的箭头函数 => 的用法

1、匿名函数

var mul = (x: Int, y: Int) => x + y
println(mul(3, 4)) //7

模式匹配(match…case)

  def TestMatch(x: Int): String = x match {
    case 1 => "one"
    case 2 => "two"
    case _ => "others"
  }
  println(TestMatch(3))

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.减少异常。