考虑这个scala代码
val word = str.toLowerCase
val chars = word.distinct.sorted
Run Code Online (Sandbox Code Playgroud)
然后是
//chars.map(c => str.toLowerCase.count(_ == c))
chars.map(c => word.count(_ == c))
Run Code Online (Sandbox Code Playgroud)
我创建了val word以避免为map创建一个新的小写字符串.但是,从理论上讲,Scala编译器可以优化它吗?它知道字符串是不可变的.
如果编译器以某种方式知道.toLowerCase总是返回相同的结果并且没有任何副作用,那么它可以优化.toLowerCase对同一对象的几次调用以仅调用一次.然而,它无法知道,在你的例子中,它甚至都不是真的.例如,根据使用的默认语言环境,"I".toLowerCase可能是"i"或"?".由于默认语言环境可以在调用之间切换,因此这种优化无效.