Mustache.js中如何用数组值循环替换同一变量名的多处占位?
用Mustache依次替换模板中重复占位符的方案
当然可行!Mustache完全能帮你搞定这个需求,而且能彻底摆脱你现在写的繁琐循环代码。下面给你两种实用的实现方式,适配不同的场景:
方案一:不修改现有模板(推荐)
如果你不想改动现有的模板文本,可以利用Mustache的Lambda功能,通过一个自定义的Supplier来依次返回数组中的元素。每次模板渲染{{replacement_data}}时,就自动取下一个数组值。
Java代码示例
import com.github.mustachejava.DefaultMustacheFactory; import com.github.mustachejava.Mustache; import com.github.mustachejava.MustacheFactory; import java.io.StringReader; import java.io.StringWriter; import java.util.List; import java.util.function.Supplier; public class MustacheSequentialReplacement { public static void main(String[] args) { // 你的原始模板 String template = "hello this is {{replacement_data}} and this {{replacement_data}} is {{replacement_data}}"; // 要替换的目标数组 List<String> replacementValues = List.of("val1", "val2", "val3"); // 创建一个带计数器的Supplier,每次调用返回下一个数组元素 Supplier<String> valueProvider = new Supplier<>() { private int currentIndex = 0; @Override public String get() { if (currentIndex < replacementValues.size()) { return replacementValues.get(currentIndex++); } return ""; // 数组元素耗尽时返回空字符串,可根据需求调整 } }; // 构建Mustache渲染上下文 Object context = new Object() { public Supplier<String> replacement_data = valueProvider; }; // 执行模板渲染 MustacheFactory mustacheFactory = new DefaultMustacheFactory(); Mustache mustache = mustacheFactory.compile(new StringReader(template), "sequential-replace"); StringWriter writer = new StringWriter(); mustache.execute(writer, context).flush(); // 输出结果:hello this is val1 and this val2 is val3 System.out.println(writer.toString()); } }
原理说明
这个方法的核心是利用Mustache对函数式接口的支持:当模板遇到{{replacement_data}}时,会调用我们定义的Supplier的get()方法,每次调用都会返回数组的下一个元素,实现了“依次替换”的效果,完全不需要手动写循环。
方案二:修改模板适配数组索引
如果你可以修改模板文本,也可以直接通过数组索引来指定每个占位符对应的值,这种方式更直观。
修改后的模板
hello this is {{data.0}} and this {{data.1}} is {{data.2}}
Java代码示例
import com.github.mustachejava.DefaultMustacheFactory; import com.github.mustachejava.Mustache; import com.github.mustachejava.MustacheFactory; import java.io.StringReader; import java.io.StringWriter; import java.util.List; public class MustacheIndexReplacement { public static void main(String[] args) { String modifiedTemplate = "hello this is {{data.0}} and this {{data.1}} is {{data.2}}"; List<String> replacementValues = List.of("val1", "val2", "val3"); Object context = new Object() { public List<String> data = replacementValues; }; MustacheFactory mustacheFactory = new DefaultMustacheFactory(); Mustache mustache = mustacheFactory.compile(new StringReader(modifiedTemplate), "index-replace"); StringWriter writer = new StringWriter(); mustache.execute(writer, context).flush(); System.out.println(writer.toString()); } }
适用场景
这种方式适合模板中占位符的数量和数组长度固定的场景,代码更简洁,但需要调整原始模板的结构。
内容的提问来源于stack exchange,提问作者John Lippson
相关产品推荐
相关产品推荐

