在Groovy中有一种条件追加字符串的方法

12

在Java中,向字符串有条件地追加内容的传统方式如下:

if (booleanFlag) {
    myString += "something to append"
}

我可以用更简洁的Groovy方式来完成相同的操作吗?最好只用一行代码实现。


1
你在问题中提出的内容比过于简化更有意义。像Tim在评论中提到的那样,在一行中写成booleanFlag ? 'something to append' : ''会起作用,因为它强制使用else条件,我认为这不是合理/实用的编程方式。 :) 这是我的看法。我会投票支持你的问题作为最佳答案。 - dmahapatro
@dmahapatro,你说得对,我没有看到更好的解决方案,这就是为什么我没有接受任何答案的原因。我只是好奇Groovy是否有针对该问题的特定解决方案,例如elvis、spaceship运算符等。三元运算符只是Java风格,正如你所注意到的,它强制使用else - Michal Kordas
Groovy确实有不同的方法(所有答案都是Groovy灵活性的例子)来解决这个问题,但你必须看哪种方法更合理,更少臃肿。 - dmahapatro
6个回答

18

用GStrings做这件事的方式非常时髦:

"$myString${booleanFlag ? 'something to append' : ''}"

7

以下是一种使用 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!'
}"""

现在这很棒!

6

尝试:

def b = true
def s = 's'

s += b ? 's' : ''

2
这里有一个解决方案,可以创建一个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 ' 

1
我认为这种模式是一种很好的元编程候选者。
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')
}

当然,还有使用元类而不是分类的选项。

2
这么简单的字符串拼接,这样做是否有点过度设计了呢?我只是在从实用编程的角度思考而已。 - dmahapatro
好的,实际上这是条件字符串拼接。至于过度工程方面,我认为这取决于它被使用的频率。Groovy没有此操作符,因此只剩下内联代码或方法调用作为选择。有很多答案展示了内联实现,所以我选择了后者。个人而言,我会使用booleanFlag ? 'something to append' : ''if (booleanFlag) myString += "something to append" - Emmanuel Rosa

-1

在我看来,这只是一行代码:

if (booleanFlag) myString += "something to append"; 

3
这个解决方案违反了 CodeNarc 规则中的 IfStatementBraces,通常在 Java 中也被认为是不良实践。 - Michal Kordas
1
myString += booleanFlag ? 'something to append' : '' 也可以,但我更喜欢问题中的第一种选项,因为三元运算符可能会导致混淆。 - tim_yates
OP 明确询问了 Groovy 的方式,他显然知道 Java,所以这个答案是无用的。 - Moataz Elmasry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接