我很好奇,如果某些块动态依赖于外部条件,那么通过顺序附加文本块来构建String值的最佳方法是什么。解决方案应该是Scala惯用的,没有太多的速度和内存损失。
例如,如何在Scala中重写以下Java方法?
public String test(boolean b) {
StringBuilder s = new StringBuilder();
s.append("a").append(1);
if (b) {
s.append("b").append(2);
}
s.append("c").append(3);
return s.toString();
}
答案 0 :(得分:9)
由于Scala具有功能性和命令性,因此惯用语一词取决于您希望遵循的范例。你已经在命令式范式之后解决了这个问题。以下是您在功能上实现这一目标的方法之一:
def test( b : Boolean ) =
"a1" +
( if( b ) "b2" else "" ) +
"c3"
答案 1 :(得分:4)
这些天,惯用意味着字符串插值。
scala
s"a1${if(b) "b2"}c3"
你甚至可以嵌套字符串插值:
scala
s"a1${if(b) s"$someMethod"}"
答案 2 :(得分:3)
如何使字符串函数的不同组件本身正确?他们必须做出决定,这对我书中的功能负有足够的责任。
def test(flag: Boolean) = {
def a = "a1"
def b = if (flag) "b2" else ""
def c = "c3"
a + b + c
}
这样做的另一个好处是它清楚地分解了最终字符串的不同组成部分,同时概述了它们如何在最高层次上组合在一起,最后不受任何其他因素的影响。
答案 3 :(得分:1)
正如@ om-nom-nom所说,你的已经是充分惯用的代码
def test(b: Boolean): String = {
val sb = new StringBuilder
sb.append("a").append(1)
if (b) sb.append("b").append(2)
sb.append("c").append(3)
sb.toString
}
我可以建议一个替代版本,但它不一定更高效或“scala-ish”
def test2(b: Boolean): String = "%s%d%s%s%s%d".format(
"a",
1,
if (b) "b" else "",
if (b) 2 else "",
"c",
3)
答案 4 :(得分:1)
在scala中,String可以被视为一系列字符。因此,解决问题的惯用功能方法是使用map
:
"abc".map( c => c match {
case 'a' => "a1"
case 'b' => if(b) "b2" else ""
case 'c' => "c3"
case _ =>
}).mkString("")