String 删除groovy中由逗号分隔的字符串中的元素

String 删除groovy中由逗号分隔的字符串中的元素,string,groovy,null,remove-if,String,Groovy,Null,Remove If,我以这种方式构建字符串: def presentationType = "${feedDisplayType}, ${moduleType}, ${cellType}" 有时变量有空值,结果字符串显示空值,我必须避免显示空值 我想知道是否有某种方法可以删除字符串中可能的空值,或者避免在出现空值时添加空值 我知道使用数组可能更容易,但我想用更直接的方式使用字符串 感谢您事先提供的帮助。编辑:此答案已更改,因为要求不打印“,”表示空术语 考虑: def feedDisplayType = 'abc

我以这种方式构建字符串:

def presentationType = "${feedDisplayType}, ${moduleType}, ${cellType}"
有时变量有空值,结果字符串显示空值,我必须避免显示空值

我想知道是否有某种方法可以删除字符串中可能的空值,或者避免在出现空值时添加空值

我知道使用数组可能更容易,但我想用更直接的方式使用字符串


感谢您事先提供的帮助。

编辑:此答案已更改,因为要求不打印“,”表示空术语

考虑:

def feedDisplayType = 'abc'
def moduleType = null
def cellType = 'ijk'

def f = { s, isLast = false ->
    def token = s ?: ''
    def seperator = (!s || isLast) ? '' : ',' 
    "${token}${seperator}"
}

def presentationType = "${f feedDisplayType}${f moduleType}${f cellType,true}"
assert 'abc,ijk' == presentationType
注意,在函数调用中,参数在Groovy中是可选的,因此
${fx}
相当于
${f(x)}
f
最初是早期版本中的
字段,但为了简洁起见,我缩短了它。

有3个选项:

1.GString插值 2.使用
StringBuilder
3.以
作为分隔符加入列表 基准 在得出结论之前,让我们使用工具对所有3种方法进行基准测试:

输出 结论 如果您的目标是实现最高吞吐量,
StringBuilder
方法是最好的方法(平均时间为77纳秒)

GString
方法比
StringBuilder
慢几倍,而且由于单个GString中的所有条件语句,因此可读性要差得多。它也很容易出错——在这种情况下,插入字符串时很容易出错

联接列表方法是最慢的一种(仅比GString方法慢大约2倍),但它是最干净的一种。而且它仍然相当快——在大多数情况下495纳秒是可以接受的。当然,优化取决于特定的用例——如果您必须每秒执行这部分代码数百万次,那么使用
StringBuilder
会更有意义

基准角落案例 为了使这个例子更完整,我们还来看看基准测试中的一些关键案例。我们对不同的输入使用相同的代码

输入:

def feedDisplayType = 'lorem ipsum'
def moduleType = 'dolor sit amet'
def cellType = '123456789'
def feedDisplayType = ''
def moduleType = ''
def cellType = ''
输出:

                      user  system  cpu  real

GString method         387       1  388   390
StringBuilder method   170       0  170   175
Join list method       847       6  853   859
                      user  system  cpu  real

GString method         237       5  242   242
StringBuilder method    44       0   44    44
Join list method       441       0  441   446
输入:

def feedDisplayType = 'lorem ipsum'
def moduleType = 'dolor sit amet'
def cellType = '123456789'
def feedDisplayType = ''
def moduleType = ''
def cellType = ''
输出:

                      user  system  cpu  real

GString method         387       1  388   390
StringBuilder method   170       0  170   175
Join list method       847       6  853   859
                      user  system  cpu  real

GString method         237       5  242   242
StringBuilder method    44       0   44    44
Join list method       441       0  441   446

是的,这几乎就是我要寻找的,但我也必须避免,你的方法很有趣。这样会像:presentationType“,”示例“和应该是presentationType“:”示例”。谢谢如果避免使用逗号是一项要求,那么你应该用这些信息更新问题。我已经更改了答案以解决“,”上的问题。关于空间的问题还不清楚,所以我假设我们不需要额外的空间。
                      user  system  cpu  real

GString method         237       5  242   242
StringBuilder method    44       0   44    44
Join list method       441       0  441   446