【发布时间】:2011-03-09 03:59:03
【问题描述】:
什么是 Scala 中的函数字面量,我应该什么时候使用它们?
【问题讨论】:
标签: scala functional-programming
什么是 Scala 中的函数字面量,我应该什么时候使用它们?
【问题讨论】:
标签: scala functional-programming
函数字面量是定义函数的另一种语法。当您想将函数作为参数传递给方法(尤其是像折叠或过滤操作这样的高阶方法)但又不想定义单独的函数时,它很有用。函数字面量是匿名的——默认情况下它们没有名称,但您可以通过将它们绑定到变量来给它们命名。函数字面量定义如下:
(a:Int, b:Int) => a + b
您可以将它们绑定到变量:
val add = (a:Int, b:Int) => a + b
add(1, 2) // Result is 3
就像我之前说的,函数字面量对于作为参数传递给高阶函数很有用。它们对于定义嵌套在其他函数中的单行或辅助函数也很有用。
A Tour of Scala 为函数文字提供了很好的参考(他们称它们为匿名函数)。
【讨论】:
apply和其他一些的对象)。
将函数文字与 Scala 中的其他类型的文字进行比较可能很有用。 Literals 是一种符号糖,用于表示该语言认为特别重要的某些类型的值。 Scala has 整数字面量、字符字面量、字符串字面量等。Scala 将函数视为源代码中可由函数字面量表示的第一类值。这些函数值位于一个特殊的function type 中。例如,
5 是一个整数文字,表示 Int 类型中的值'a' 是一个字符文字,表示Char 类型中的值(x: Int) => x + 2 是一个函数字面量,表示 Int => Int 函数类型中的值字面量通常用作匿名值,也就是说,不首先将它们绑定到命名变量。这有助于使程序更简洁,并且适用于不意味着可重用的文字。例如:
List(1,2,3).filter((x: Int) => x > 2)
对比
val one: Int = 1
val two: Int = 2
val three: Int = 3
val greaterThan2: Int => Boolean = (x: Int) => x > two
List(one,two,three).filter(greaterThan2)
【讨论】:
List(1,2,3).map(x => x + 10) 这行不通:List(1,2,3).map((x: Int) : Str => x.toString) 这行得通,但不是那么明确:List(1,2,3).map((x: Int) => x.toString) 或者如果我想这样做,我应该使用命名函数?
List(1,2,3).map((x: Int) => { x.toString }: String)
8.3 一级函数
一个函数字面量被编译成一个类,在运行时实例化时是一个函数值。[2]因此,函数字面量和值之间的区别在于,函数字面量存在于源代码中,而函数值在运行时作为对象存在。区别很像类(源代码)和对象(运行时)。
【讨论】: