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

Jiř*_*řík 7 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();
}
Run Code Online (Sandbox Code Playgroud)

Nik*_*kov 11

由于Scala功能强大且势在必行,因此惯用词一词取决于您希望遵循的范例.你已经在命令式范式之后解决了这个问题.以下是您可以在功能上执行此操作的方法之一:

def test( b : Boolean ) =
  "a1" + 
  ( if( b ) "b2" else "" ) +
  "c3"
Run Code Online (Sandbox Code Playgroud)

  • 这也在引擎盖下使用了一个`StringBuilder`,因此性能良好.实际上,字节码方式,这几乎与您的Java代码相同. (5认同)

Sco*_*rey 6

如今,惯用语是指字符串插值。

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

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

scala s"a1${if(b) s"$someMethod"}"


Rus*_*ell 5

怎样使字符串函数的不同组件自己发挥作用呢?他们必须做出决定,这对于我的书中的功能是足够负责的。

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

这样做的另一个好处是,它显然可以分解最终字符串的不同组成部分,同时在最后概述了它们如何在较高水平下相互组合,而不受任何其他因素的影响。