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