为什么Scaladoc中的一些方法描述开始于[use case]
?
例: scala.collection.immutable.StringOps.++
它只是一个将来被替换的占位符吗?
楼梯书的摘录:
如果效率非常重要,那就倾向于使用一门课程.大多数Java运行时使类成员的虚方法调用比接口方法调用更快.Traits被编译到接口,因此可能会产生轻微的性能开销.但是,只有当您知道所讨论的特征构成性能瓶颈并且有证据表明使用类实际上解决了问题时,才应该做出此选择.
我写了一些简单的代码来看看幕后真的发生了什么.我确实注意到invokevirtual
在抽象类和invokeinterface
接口的情况下使用.但无论我写的是什么样的代码,他们总是粗略地执行相同的操作.我在服务器模式下使用HotSpot 1.6.0_18.
是JIT在优化方面做得如此出色吗?有没有人有一个示例代码证明书中有关invokevirutal
更快操作的声明?
有没有人遇到Java/Java EE框架,如果与Scala一起使用会导致问题?
我是从ScalaTest测试java代码的单元,并希望在声明它的同一语句中填充java.util.HashMap.可以在Scala中执行此操作吗?
在对这个问题的公认最佳回答中,有一个明确的解释为什么拳击发生.
但是,如果我反编译代码(使用java反编译器),我看不到使用scala.runtime.BoxesRunTime.此外,如果我分析代码(使用JProfiler),我看不到BoxesRunTime的任何实例.
那么,我怎么能真正看到拳击/拆箱的证据呢?
我正在寻找一个将列表划分为固定大小的子列表的功能,这正是Google Collections库中的Lists.partition所做的.我在Scala Collections API中找不到这样的方法.我错过了什么吗?
从这个比较序列库在JVM上,它看起来是更快地创建斯卡拉对象比在Java中.不过,差异在几纳秒之内.
有没有什么真正的理由可以在Scala中创建一个对象花费更少的时间,或者图表只是反映了不正确的基准测试或其他一些不精确的情况?
想象一下这段代码:
class Foo {
println("in Foo")
def foo(a: Int) = a + 1
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我们调用:
new Foo().foo _
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,将创建类Foo的实例:
in Foo
res0: (Int) => Int = <function1>
Run Code Online (Sandbox Code Playgroud)
但是,如果我们调用它:
new Foo().foo(_)
Run Code Online (Sandbox Code Playgroud)
Foo的构造函数不会被调用:
res1: (Int) => Int = <function1>
Run Code Online (Sandbox Code Playgroud)
如果我们说:
res1(7)
Run Code Online (Sandbox Code Playgroud)
那是Foo实例化的时候:
in Foo
res2: Int = 8
Run Code Online (Sandbox Code Playgroud)
为什么Eta扩展与部分函数应用程序在类实例化方面有所不同?
为什么Scala Collections API中的集合和列表之间缺乏一致性?
例如,存在不可变的Set,但也是可变的Set.如果我想使用后者,我可以简单地这样做:
val set = Set[A]()
set += new A
Run Code Online (Sandbox Code Playgroud)
但是,本身没有可变列表.如果我想使用Lists编写类似的代码片段,使用哪种数据结构?LinkedList听起来很好,因为它是可变的,但没有定义+ =方法.ListBuffer似乎满足要求,但它不是一个列表.
阅读2.8 Collections文档后,我得出结论MutableList可能是最合适的.
我仍然希望有scala.collection.mutable.List.
scala ×13
java ×2
boxing ×1
frameworks ×1
guava ×1
hashmap ×1
jvm ×1
ocaml ×1
performance ×1
reflection ×1
scaladoc ×1
scalatest ×1
unboxing ×1