2013-07-26 26 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

相關問題