在Java中,向字符串有条件地追加内容的传统方式如下:
if (booleanFlag) {
myString += "something to append"
}
我可以用更简洁的Groovy方式来完成相同的操作吗?最好只用一行代码实现。
用GStrings做这件事的方式非常时髦:
"$myString${booleanFlag ? 'something to append' : ''}"
以下是一种使用 GString闭包的时髦方式:
>>> def world = false
>>> def people = true
>>>
>>> def message = "Hello${sw -> if (world) sw << ' World'; if (people) sw << ' People'}"
>>>
>>> message
Hello People
>>>
>>> people = false
>>> world = true
>>>
>>> message
Hello World
>>>
>>> world = false
>>> message
Hello
这个字符串看起来有点长,需要一些缩进,但是Groovy shell不允许我拆分行。切换到IDE后,发现你可以用三引号字符串更好地编写字符串:
def message =
"""Hello${sw ->
if (false) sw << ' World!'
if (false) sw << ' People!'
if (true) sw << ' Groovy!'
}"""
尝试:
def b = true
def s = 's'
s += b ? 's' : ''
String.metaClass.when
方法:String.metaClass.when = { it ? delegate : '' }
测试:
flag = true
myString = 'foo '
myString += "to append".when flag
assert myString == 'foo to append'
myString = 'foo ' + "to append".when(false)
assert myString == 'foo '
def myString = 'Hello'
use(StringBuilderCategory) {
assert new StringBuilder(myString).append(true, 'World').toString() == 'HelloWorld'
assert new StringBuilder(myString).append(false, 'World').toString() == 'Hello'
}
class StringBuilderCategory {
static StringBuilder append(StringBuilder builder, boolean condition, String str) {
if(condition) {
builder.append(str)
} else {
builder
}
}
}
StringBuilder
来避免暗示 String
是可变的,但是可以添加类似的方法到 String
中来将其简化为如下代码:use(TheCategory) {
myString = myString.append(booleanFlag, 'something to append')
}
booleanFlag ? 'something to append' : ''
或if (booleanFlag) myString += "something to append"
。 - Emmanuel Rosa在我看来,这只是一行代码:
if (booleanFlag) myString += "something to append";
myString += booleanFlag ? 'something to append' : ''
也可以,但我更喜欢问题中的第一种选项,因为三元运算符可能会导致混淆。 - tim_yates
booleanFlag ? 'something to append' : ''
会起作用,因为它强制使用else
条件,我认为这不是合理/实用的编程方式。 :) 这是我的看法。我会投票支持你的问题作为最佳答案。 - dmahapatroelse
。 - Michal Kordas