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

groovy中替换许多令牌的最有效方法,groovy,functional-programming,closures,Groovy,Functional Programming,Closures,我在一个字符串中有n个随机标记,我想使用闭包将每个值替换为一个方法的返回值 e、 g String theString=“嗨,这是\$randomEmail,这是一个rand 字符串:\$randomString,这是一个随机的\$RandomPhoneNumber“ 然后我想做的是基于roke调用每个适用的方法,用实际值替换该字符串-例如,对于电子邮件地址令牌($randomEmail),然后我想调用以下方法 String randomEmailAddress() { retu

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

e、 g

String theString=“嗨,这是\$randomEmail,这是一个rand 字符串:\$randomString,这是一个随机的\$RandomPhoneNumber“

然后我想做的是基于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()}}]
Map randomStrings=[randomEmail:{randomEmailAddress()},randomUserName:{randomString(8),randomPhoneNumber:{randomPhoneNumber()}]
然后对字符串调用replace函数,并依次用正确的随机值替换每个令牌

注意:我需要处理许多基本字符串(示例仅显示其中一个),并且我可能会同时拥有映射(模型)中文件中的所有值,也可能不会

我知道我可以用if语句来实现这一点,但这违背了学习闭包的目的:-)

提前感谢,

伊恩。

您可以使用:


我假设字符串不能更改?ie:
def theString=“嗨,这是${randomEmail()}这是一个随机字符串:${randomString()}这是一个随机的${randomTelephoneNumber()}”
是不可能的?不。它是从外部文件读取的(为了简单起见,我将其内联),但是一个聪明的方法永远不会少…我总是忘记
SimpleTemplateEngine
。。。比我的答案好得多:-在实践中,我也这么做!作为开发人员,在尝试做一些简单的事情时,我们经常比自己聪明。谢谢&非常接近成功,但是我在文件之间更改了占位符,所以我并不总是在模板中为每个外部文件都添加了每个标记-使用StringTemplate,我得到了以下例外,google似乎认为没有办法围绕这个问题groovy.lang.MissingPropertyException:无此类属性:类的随机用户名:SimpleTemplateScript2@Ian这里的代码使用不同的大写字母
randomUserName
vs
randomUserName
。所以你有你事先不知道的属性?你应该如何处理它们?@Ian尝试将模型更改为:
Map model=[randomEmail:{->randomEmailAddress()},randomUserName:{->randomUserName()}]。默认值为{“\$$it”}
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()