在groovy中最有效的方法来替换许多令牌

时间:2013-07-26 13:47:26

标签: groovy functional-programming closures

我在字符串中有 n 随机标记,我想使用闭包来用方法的返回值替换每个值。

e.g。

  

String theString =“嗨,这是\ $ randomEmail,这是一个兰特   string:\ $ randomString,这是一个随机的\ $ randomTelephoneNumber“

然后,我想做的是调用基于roke的每个适用方法,用实际值替换该字符串 - 例如对于电子邮件地址令牌($ randomEmail),我想调用以下方法;

String randomEmailAddress() {
        return new StringBuilder(RandomStringUtils.random(6)).append("@").append(RandomStringUtils.random(6)).append(".com").toString();
    }

希望使用闭包字符串替换功能,但稍微坚持下一步......

 Map<String,Closure> randomStrings = [randomEmail:{randomEmailAddress()},randomUserName:{randomString(8),randomTelephoneNumber:{randPhoneNumber()}}]

然后调用字符串上的replace函数,并将每个标记依次替换为正确的随机值。

注意:我需要操作许多基本字符串(该示例仅显示其中一个)并且我可能会或可能不会在任何一个地图(模型)中的文件中存在所有值时间。

我知道我可以用if语句来做这件事,但却无法学习闭包的目的: - )。

提前感谢,

伊恩。

1 个答案:

答案 0 :(得分:6)

您可以使用Groovy Templates

import groovy.text.SimpleTemplateEngine

// single quotes are important here, this needs to be a string, not a gstring.
String template = 'Hi, this is $randomEmail and this is a random username: $randomUserName'

Map model = [
    randomEmail: { -> randomEmailAddress() }, 
    randomUserName: { -> randomUserName() }
]

String result = new SimpleTemplateEngine().createTemplate(template)
    .make(model).toString()