Scala是否在链接函数中执行优化?

花花公子
val list1 : List[String] = List(....)
val list2 : List[String] = List(....)
val filtered = list1.filter(list2.toSet.contains)

使用上面的代码时,将为其中的toSet每个项目调用list1(在这种情况下,我应该添加另一个项目val set2 = list2.toSet,或者Scala编译器是否对此进行优化),在这种情况下,上面的代码将只运行toSet一次?

阿列克谢·罗曼诺夫(Alexey Romanov)

无需优化,toSet只能运行一次:

  1. 用于转换list2.toSet.contains为lambda的eta扩展规则在这种情况下,翻译是

    list1.filter({
      val x1 = list2.toSet
      { (y1: String) => x1.contains(y1) }
    })
    
  2. 方法的参数在调用之前进行评估(按名称调用参数除外,但这不是一个),要评估该参数,val x1 = list2.toSet首先执行该块,然后{ (y1: String) => x1.contains(y1) }返回。

但是,如果您愿意,您当然可以更加明确。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章