字符串插值vs级联
发布时间:2020-12-16 09:17:12 所属栏目:安全 来源:网络整理
导读:字符串插入是否比连续化在 scala中构建一个字符串更好?例如: val myVal = "def"val test = s"abs${myVal}ghi" VS val test = "abc" + myVal + "ghi" 我要问的是因为我需要为一个有很多参数的类写入toString方法,因此插入的字符串因此变得很长时间并且令人
字符串插入是否比连续化在
scala中构建一个字符串更好?例如:
val myVal = "def" val test = s"abs${myVal}ghi" VS val test = "abc" + myVal + "ghi" 我要问的是因为我需要为一个有很多参数的类写入toString方法,因此插入的字符串因此变得很长时间并且令人困惑,我想将其分解成多行,但是如果我串连. 解决方法
我做了一个简单的例子:
class Employee(name: String,age: Int) { private var s = 0.0 def salary = s def salary_=(s: Double) = this.s = s def toStringConcat(): String = { "Name: " + name + ",age: " + age + ",salary: " + salary } def toStringInterpol(): String = { s"Name: $name,age: $age,salary: $salary" } } object Program { val empl = new Employee("John",30) empl.salary = 10.50 val times = 10000000; def main(args: Array[String]): Unit = { // warming-up val resultConcat = empl.toStringConcat val resultInterpol = empl.toStringInterpol println("Concat -> " + resultConcat) println("Interpol -> " + resultInterpol) val secondsConcat0 = run(empl.toStringConcat) val secondsInterpol0 = run(empl.toStringInterpol) val secondsConcat1 = run(empl.toStringConcat) val secondsInterpol1 = run(empl.toStringInterpol) println("Concat-0: " + secondsConcat0 + "s") println("Concat-1: " + secondsConcat1 + "s") println("Interpol-0: " + secondsInterpol0 + "s") println("Interpol-1: " + secondsInterpol1 + "s") } def run(call: () => String): Double = { val time0 = System.nanoTime() var result = "" for (i <- 0 until times) { result = call() } val time1 = System.nanoTime() val elapsedTime = time1 - time0; val seconds = elapsedTime / 1000000000.0; seconds } } 结果如下: Concat -> Name: John,age: 30,salary: 10.5 Interpol -> Name: John,salary: 10.5 Concat-0: 2.831298161s Concat-1: 2.725815448s Interpol-0: 3.846891864s Interpol-1: 3.753401004s 内插情况较慢.原因可以在生成的代码中找到: public String toStringConcat() { return new StringBuilder().append("Name: ").append(this.name).append(",age: ").append(BoxesRunTime.boxToInteger(this.age)).append(",salary: ").append(BoxesRunTime.boxToDouble(salary())).toString(); } public String toStringInterpol() { return new StringContext(Predef..MODULE$.wrapRefArray((Object[])new String[] { "Name: ",",age: ",salary: ","" })).s(Predef..MODULE$.genericWrapArray(new Object[] { this.name,BoxesRunTime.boxToInteger(this.age),BoxesRunTime.boxToDouble(salary()) })); } 我使用Scala 2.10.3和IntelliJ IDEA 13. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |