2

考虑下面的代码,我将一个方法和一个函数作为参数传递给 map()

  val list1:List[Int]=List(10,20,30)

  def func1(x:Int):Int={
      x+10
  }

  list1.map(func1)
  list1.map(_+10)

我对 ETA 扩展有几个问题:

  • 使用方法代替函数是否存在性能差异,特别是因为该方法在内部被转换为函数?
  • def x:Int=10和之间有性能差异val x:Int=10吗?
  • 我读过按名称调用参数实际上是一种不接受任何参数的方法。现在,如果方法不是对象,我们如何使用方法作为参数值?
4

2 回答 2

2

您要询问的表达式之间没有显着差异。

val x产生一个私有字段。

请注意,vs.map(_+10)vs.map(x => f(x)). 但是无论如何你都必须创建一个函数对象。

按名称调用的参数=> X() => X底层的。

从 REPL 中,用于javap显示代码。-c对于代码,-v对于详细。

scala> vs.map(f)
res0: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10, 11)

scala> :javap -pv -
[snip]
于 2017-02-08T05:32:09.077 回答
0

区别之一是,val值是在加载类时def测量的,而在调用时测量值。

一个简单的例子是,假设你val在类中有 100K 变量(为了论证),系统可能需要很长时间才能启动。但是如果你有一个def A在其中声明 100K的valA只有在调用时才会影响性能。

于 2017-02-08T10:20:18.293 回答