在Scala中执行字符串条件连接的最惯用方法

时间:2013-05-17 10:24:22

标签: scala

我很好奇,如果某些块动态依赖于外部条件,那么通过顺序附加文本块来构建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();
}

5 个答案:

答案 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("")