7

I'm curious what would be the best way to build a String value via sequential appending of text chunks, if some of chunks dynamically depend on external conditions. The solution should be idiomatic for Scala without much speed and memory penalties.

For instance, how one could re-write the following Java method in Scala?

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();
}
4

5 回答 5

11

由于 Scala 既是函数式的又是命令式的,术语惯用语取决于您喜欢遵循哪种范式。您已经按照命令式范式解决了问题。这是您可以在功能上做到这一点的方法之一:

def test( b : Boolean ) =
  "a1" + 
  ( if( b ) "b2" else "" ) +
  "c3"
于 2013-05-17T10:44:43.930 回答
8

如今,惯用的意思是字符串插值。

s"a1${if(b) "b2" else ""}c3"

您甚至可以嵌套字符串插值:

s"a1${if(b) s"$someMethod" else ""}"
于 2016-10-11T17:41:21.397 回答
5

让字符串函数的不同组成部分各自独立怎么样?他们必须做出决定,这对于我书中的功能来说已经足够负责了。

def test(flag: Boolean) = {
  def a = "a1"
  def b = if (flag) "b2" else ""
  def c = "c3" 
  a + b + c
}

这样做的另一个好处是它清楚地分解了最终字符串的不同组成部分,同时在最后概述了它们如何在高水平上组合在一起,不受其他任何东西的影响。

于 2013-05-17T10:45:06.983 回答
2

正如@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)
于 2013-05-17T10:37:41.363 回答
2

在 scala 中,可以将 String 视为字符序列。因此,解决您的问题的惯用功能方法是map

"abc".map( c => c match {
  case 'a' => "a1"
  case 'b' => if(b) "b2" else ""
  case 'c' => "c3"
  case _ =>
}).mkString("")
于 2016-02-16T18:51:32.787 回答