2013-07-26 28 views
3

我有n字符串中的随机标记,我想用闭包来用方法的返回值替换每个值。Groovy中取代许多标记的最有效方法

例如

字符串theString = “你好,这是\ $ randomEmail,这是一个兰特 字符串:\ $ 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()}}] 

然后调用的字符串替换功能,在依次每个令牌被替换正确的随机值。

注意:我需要操作很多基本字符串(该示例仅显示其中的一个),并且我可能或可能不具有映射(模型)中文件中存在的所有值一次。

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

在此先感谢,

伊恩。

+0

我认为字符串不能改变?即:'def theString =“嗨,这是$ {randomEmail()},这是一个rand字符串:$ {randomString()},这是一个随机$ {randomTelephoneNumber()}”'是不可能的? –

+0

编号它正在从外部文件中读取(为简单起见,我将其内插),但智能方法永远不会少... – Ian

回答

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() 
+0

我*总是*忘记'SimpleTemplateEngine' ...比我的答案要好得多:-D –

+1

In练习,我也一样!作为开发人员,我们在尝试简单操作时经常会胜过自己。 – codelark

+0

感谢和非常接近的作品,但我在文件之间的占位符更改,所以我并不总是在每个外部文件的模型中的模板中的每个标记 - 使用StringTemplate我得到以下异常和谷歌似乎建议那里是没有办法解决这个问题? - groovy.lang.MissingPropertyException:没有这样的属性:类的randomUsername:SimpleTemplateScript2 – Ian

相关问题