函数字面量

函数是一个可执行代码块,它接收输入参数返回一个值。它概念上与数学中的函数相似,它接收输入并返回一个输出。

Scala是一个函数式编程语言,它将函数当作一等公民;一个函数可以像一个变量一样被使用。函数可以作为输入参数传给另一个函数。函数可以定义为一个匿名函数字面量,就像字符串字面量;函数可以被赋给一个变量。可以在一个函数内定义函数。函数可以作为另外一个函数的输出返回值。

在Scala中,一切皆对象,因此函数也必须是对象。

函数字面量

函数字面量。函数字面量指的是在源代码中的一个未命名函数或匿名函数。在程序中可以像使用一个字符串变量一样使用它。它还可以作为一个输入参数传递给一个高阶方法或高阶函数。另外,它也可以被赋给一个变量。

字面量函数的定义是使用一个小括号,里面是输入参数,后跟一个右箭头和一个函数体。函数字面量的函数体是封闭在一个可选地花括号中的。其语法为:(参数列表):返回值 => 函数体。

下面是一个函数字面量的例子:

(x:Int) => {
    x + 100;
}

如果该函数体由单行语句组成,那么可以省略花括号。上面代码的一个简写版本是:

(x:Int) => x + 100;

函数字面量经常作为高阶函数的输入参数。

// 最简单的函数
() => println("hello")   // 无参

(i:Int) => {println("Hello"); println(i * i); i * i}   // 传入一个int参数

一切皆对象,当然函数也是对象,所以可以将它赋给一个变量:

val func1 = () => println("hello")
func1()              // 执行函数

val func = (i:Int) => {println("Hello"); println(i * i)}
func(3)              // 执行函数

函数字面量也可以作为一个输入参数传递给一个高阶方法或高阶函数:

val func = (i:Int) => {val j = i*i; println(j)}    
val list1 = List(1,2,3,4,5)    
list1.foreach(func)

或者,更简单一点:

val list1 = List(1,2,3,4,5)

// list1.foreach((i:Int) => {val j = i*i; println(j)})
// list1.foreach(i => {val j = i*i; println(j)})
list1.foreach(i => {println(i*i)})

函数执行以后可以有返回值。在Scala中,函数体的最后一行表达式的值,就是函数返回值。

val func2 = (x:Int) => {
    println("这是func2的函数体")
    x*x
}
val result = func2(2)   // 将函数的返回值赋给变量result
println(result)

《Flink原理深入与编程实战》