【发布时间】:2014-08-08 18:08:40
【问题描述】:
假设我们有以下代码sn-p:
List(1, 2, 3)
.map(doubleIt) // passing function
.map(x => doubleIt(x)) // applying function
def doubleIt(i: Int): Int = 2 * i
如您所见,我们可以将 doubleIt 作为函数文字传递,也可以将其应用到另一个匿名 Lambda 中。我一直想知道哪种方法更好。我个人更喜欢传递函数文字,因为似乎第二种方法最终会无缘无故地创建一个额外的包装器 Lambda,但我并不是 100% 肯定我的推理是正确的。
我很想知道每种风格的优缺点是什么,以及哪种风格肯定比另一种更好。
【问题讨论】:
-
术语的小点:第二个是“函数字面量”,但不是第一个。
-
其实这两种形式是一样的。 Scala 编译器将第一种形式隐式转换为第二种形式。两者都告诉 Scala 编译器通过将
doubleIt函数应用于列表的每个成员来创建一个新列表。至于风格,第二种形式更冗长,因此具有更明确的行为,而第一种形式更简洁,可能更受Scala老手的青睐。我猜这是个人喜好问题。 -
另外,如果
doubleIt没有在其他地方使用,我个人更喜欢第三个选项:List(1,2,3).map{_ * 2} -
@MikeAllen 这不太对;看我的回答。