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

Man*_*nie 3 groovy closures functional-programming

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

例如

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

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

String randomEmailAddress() {
        return new StringBuilder(RandomStringUtils.random(6)).append("@").append(RandomStringUtils.random(6)).append(".com").toString();
    }
Run Code Online (Sandbox Code Playgroud)

希望使用闭包字符串替换功能,但有点卡在接下来的步骤..

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

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

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

我知道我可以用if语句做到这一点,但却打破了学习闭包的目的:-).

提前致谢,

伊恩.

cod*_*ark 6

您可以使用Groovy模板:

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()
Run Code Online (Sandbox Code Playgroud)