// can be defined in the same function, or as static variable in the class or even
// in other class
final String URL_TEMPLATE = 'http://fake.weather.com/rest/%s' // arg - country abbreviation
// ...
// Here we want to get weather for different countries.
def countries = ['US', 'DE', 'GB']
for (country in countries) {
def url = URL_TEMPLATE.format(country)
// send the request, accumulate the results
}
def user = "root"
def password = "toor"
// Note: Remember to use single quotes!
def result = "User: ${user}\nPassword: ${password}"
assert result == "User: root\nPassword: toor"
// Now template can be defined before variables
def template = "User: %s\nPassword: %s"
def user = "root"
def password = "toor"
def result = String.format(template, user, password)
assert result == "User: root\nPassword: toor"
优点:
快速
简单型
标准的Java库,因此Java开发人员将熟悉它
少量变量的良好可读性
内置数字格式化程序(如添加前导零、尾随零等)
可以在定义变量之前定义模板
缺点:
对于大量的变量,可读性会急剧下降,因为您以Hello %s, I'm %s and I'm %d old. I live in %s, %s. My %s is %s.这样的模板结束
变量必须作为单独的参数传递 *精彩冲刺
def template = "User: %s\nPassword: %s"
def result = sprintf(template, ["root", "toor"])
assert result == "User: root\nPassword: toor"
5条答案
按热度按时间ni65a41a1#
Groovy内置了对字符串插值的支持。您所需要的只是使用一个
GString
:如果值是以数组或集合的形式出现的,甚至可以使用
params[n]
来代替命名变量($name
),如下所示:如果您的字符串需要外部化,可以使用template engines
除此之外,您还可以使用普通的Java
String.format
:rta7y2nd2#
基于java的groovy,在java中,
String
类中有format
方法您必须先建立一个对象,然后才能使用它。
所以这个应该能用
pgvzfuti3#
您可以使用DefaultGroovyMethods中的sprintf
rm5edbpk4#
在单个位置收集上述答案和评论,有两种方法:
1.基于Java
String.format
函数see above,它在groovy中被 Package 到方便函数sprintf
中,参见例如here或here1.基于字符串插值,更具体地说,这种情况。
1.[编辑]正如ernest_k在评论中所建议的,模板化的更好的解决方案是模板引擎。它比单纯的String.format强大得多,但当然,需要一些学习。
在我个人看来,第一个选项更适合最初提出的问题,因为它允许创建“模板”字符串,然后可以在代码中的任意位置使用任意参数任意次数。这似乎是最初问题中的用例。
通常,字符串插值和sprintf之间有两个主要区别:
1.字符串插值不允许格式化值。
1.字符串插值是在定义它的地方进行求值的(以它的标准形式),所以它不允许模板化。即使以它的“特殊”形式(
{-> expr}
)使用,它仍然没有模板应用的显式行为,而是依赖于具有特定名称的外部定义的变量,在我看来这是不太可靠的。作为模板化用例的示例,请考虑:
这个解决方案不容易使用字符串插值。当然,我承认,它仍然有可能建立解决方案也基于字符串插值,但它会看起来很不一样。
wixjitnu5#
Groovy有一个SimpleTemplateEngine可以使用。对于简单的情况来说,这可能有点过头了,但是举个例子,假设你想从一个文件中读取一个模板,并在那里注入变量。使用
%s
将是一场噩梦。SimpleTemplateEngine是一种方法:所以总结一下:
*Groovy字符串插值
优点:
缺点:
"Hello ${someRandomFunction('Arnold', anotherFunction(arr[1]))}"
*Java字符串格式
优点:
缺点:
Hello %s, I'm %s and I'm %d old. I live in %s, %s. My %s is %s.
这样的模板结束*精彩冲刺
优点:
Java String.format
相同缺点:
Java String.format
相同,但传递变量的cons除外*Groovy简单模板引擎
优点:
缺点:
"Hello ${someRandomFunction('Arnold', anotherFunction(arr[1]))}"
一般来说,我最喜欢的是Groovy的String插值和SimpleTemplateEngine,因为我不介意多导入一个类。但选择权在你:)