1. 占位符 _html
针对 Scala 基础(7)—— 函数字面量和一等函数 中最后提到的,关于 filter 函数字面量的精简写法,可使用占位符 _ 来代替。java
占位符_,用来表示一个或者多个参数。(这里的多个参数不是表示一个下划线表明多个参数,而是多个下划线能够表明多个参数)app
在函数字面量的表达中,能够将下划线当作是“要填的空”,函数每次被调用时,这个“空”就回被一个参数“填”上。函数
例如:post
def main(args: Array[String]): Unit = { val list = List(1, 2, 3) list.filter(x => x > 0) list.filter(_ > 0) // 与上面的调用是等价的 }
这种调用仅限于 Scala 编译器可以在编译期间推断出参数的类型。url
当编译器没法再编译期间推断参数类型,则必须显式地给出参数类型。spa
例如:htm
def main(args: Array[String]): Unit = { // val sum = _ + _ // 编译失败 val sum = (_: Int) + (_: Double) println(sum(1,2)) // 输出3.0 }
2. 部分应用函数blog
在使用下划线时,本质上是在编写一个部分应用函数(partially applied function)。get
这里的意义在于:
当调用某个函数,传入任何参数时,其实是应用那个函数到这些参数上。
固然这种描述过于抽象,因此咱们看下面的例子:
首先,定义一个方法 sum():
def sum(a: Int, b: Int, c: Int) = a + b + c
显然,这是一个计算三个整数和的方法。通常的调用方式以下:
val value = sum(1, 2, 3)
以上是一个简单的方法的调用,部分应用函数的功能,就是将 def 定义的方法,映射成函数值的形式。
例如:
val f = sum _ // f 是一个 (Int, Int, Int) => Int 类型的函数字面量
以上,将方法映射成了一个 (Int, Int, Int) => Int 类型的函数字面量。
它的调用方式与方法相似,可是本质发生了改变:
val value = f(1, 2, 3)
之因此称为部分应用函数,是由于你并无把那个函数应用到全部的入参。
仍是拿上面的例子作说明,能够经过给出一些必填的参数来表达一个部分应用函数:
val f = sum(1, _: Int, 2) // f 是一个 Int => Int 类型的函数字面量
在这个例子中,部分应用函数给出了第一个和第三个参数,因为只缺失一个参数,编译器将生成一个新的函数字面量,类型是 Int => Int。
部分应用函数的做用在于:
虽然不能将方法或嵌套的函数直接赋给某个变量,或者做为某个函数的入参,可是能够经过部分应用函数的方式,将其转成一个函数值来完成这些操做。
最后须要说明的是,只有明确须要函数的地方,才能使用部分应用函数。