【发布时间】:2015-06-15 21:10:19
【问题描述】:
在 Scala 中,for 和 for-yield 循环通常被转换为使用 Lambda 调用的 map、flatMap 和 filter 的序列。由于编译器将那里的 Lambda 转换为匿名类,而不是 Java 8 的花哨的 invokedynamic / LambdaMetafactory / Unsafe.defineAnonymousClass 系统。这显然会为临时类及其实例带来大量开销,以及通常复制其底层集合的 map、flatMap 和过滤器操作的开销。当通常更快的迭代方法可用时,至少在字节码级别上,是否有任何特别的理由使用函数式方法来解决问题?
例如,为什么
for {
sl <- l
el <- sl
if el > 0
} println el.toString.length
翻译成
l.flatMap(sl => sl.filter(el => el > 0).foreach(el => println el.toString.length))
代替
for (sl <- l) // Iterable for loop
{
for (el <- sl) // Iterable for loop
{
println el.toString.length
}
}
【问题讨论】:
-
filter通常有withFilter- 编译器在必须回退到过滤器时会生成警告,我相信 2.11 或 2.12 完全拒绝if保护未实现 @ 的类987654336@
标签: scala lambda for-comprehension