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
一次?
无需优化,toSet
只能运行一次:
用于转换list2.toSet.contains
为lambda的eta扩展规则。在这种情况下,翻译是
list1.filter({
val x1 = list2.toSet
{ (y1: String) => x1.contains(y1) }
})
方法的参数在调用之前进行评估(按名称调用参数除外,但这不是一个),要评估该参数,val x1 = list2.toSet
首先执行该块,然后{ (y1: String) => x1.contains(y1) }
返回。
但是,如果您愿意,您当然可以更加明确。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句