Groovy字符串占位符动态替换的简洁高效实现方案问询
针对Groovy字符串占位符替换的两类场景解决方案
刚好在Groovy里处理过类似的占位符替换需求,给你分享两个针对性的简洁高效方案:
场景1:占位符字符串与值定义在不同类中
这种情况核心是把目标类的字符串模板,和当前类的变量值做绑定,有两种常用方式:
方式1:安全可控的模板引擎(推荐)
用Groovy自带的GStringTemplateEngine,它能清晰分离模板和数据,且避免注入风险:
// 定义占位符字符串的类A class A { static def strPlaceholder = 'token = ${tokenValue}, user_id = ${userId}' } // 持有变量值的类B class B { def replaceTemplate() { // 准备要替换的键值对 def valueMap = [tokenValue: 'XYZ-789', userId: 1001] // 初始化模板引擎并生成结果 def templateEngine = new groovy.text.GStringTemplateEngine() def result = templateEngine.createTemplate(A.strPlaceholder).make(valueMap).toString() println result // 输出: token = XYZ-789, user_id = 1001 } }
方式2:简洁的上下文求值(仅内部代码用)
如果模板字符串完全是内部可控的,没有外部输入风险,用evaluate可以一步到位,直接在当前上下文执行模板表达式:
class B { def tokenValue = 'XYZ-789' def userId = 1001 def quickReplace() { def result = evaluate(A.strPlaceholder) println result // 同样输出目标内容 } }
场景2:字符串作为方法参数传入,替换为方法局部变量
这种场景需要把方法内的局部变量传递给模板字符串,同样可以用模板引擎或者上下文绑定:
方式1:模板引擎+局部变量Map
把方法内的局部变量封装成Map,传给模板引擎处理:
def renderTemplate(String templateStr) { // 方法内的局部变量 def greet = 'Hi there' def tool = 'Groovy' // 绑定变量并生成结果 def bindingMap = [greet: greet, tool: tool] def engine = new groovy.text.GStringTemplateEngine() def finalStr = engine.createTemplate(templateStr).make(bindingMap).toString() return finalStr } // 调用示例 def output = renderTemplate('${greet}! This is ${tool} placeholder demo.') println output // 输出: Hi there! This is Groovy placeholder demo.
方式2:with上下文+evaluate(更简洁)
利用Groovy的with方法切换上下文,直接用evaluate处理模板:
def renderTemplate(String templateStr) { def greet = 'Hi there' def tool = 'Groovy' def finalStr = [greet: greet, tool: tool].with { evaluate(templateStr) } return finalStr }
额外封装:通用工具方法
如果经常需要做这类替换,可以封装成工具类,避免重复代码:
class PlaceholderReplacer { // 通用模板替换方法 static String replace(String template, Map<String, Object> valueMap) { new groovy.text.GStringTemplateEngine() .createTemplate(template) .make(valueMap) .toString() } // 基于当前上下文的快捷替换 static String replaceFromCurrentContext(String template) { evaluate(template) } }
内容的提问来源于stack exchange,提问作者Alexey Mitrofanov
相关产品推荐
相关产品推荐

