带有命名参数的Java字符串模板化器/格式化程序

Gre*_*Cat 9 java template-engine string-formatting

有没有标准或至少广泛实现的东西String.format,但有命名参数?

我想以这样的方式格式化一个模板化的字符串:

Map<String, Object> args = new HashMap<String, Object>();
args.put("PATH", "/usr/bin");
args.put("file", "foo");
String s = someHypotheticalMethod("#{PATH}/ls #{file}");
// "/usr/bin/ls foo"
Run Code Online (Sandbox Code Playgroud)

从技术上讲,它几乎与:

String[] args = new String[] { "/usr/bin", "foo" };
String s = String.format("%1$s/ls %2$s", args);
// "/usr/bin/ls foo"
Run Code Online (Sandbox Code Playgroud)

但是有了命名参数.

我知道:

但是他们都使用有序或至少编号的参数,而不是命名参数.我知道实现一个是微不足道的,但是我是否正在寻找标准Java库中的机制,或者至少在Apache Commons/Guava /类似的东西中,而不引入高调的模板引擎?

注意:我对真正的模板引擎并不感兴趣,它具有一些命令/功能逻辑,流控制,修饰符,子模板/包含,迭代器等功能.通常,以下方法是一个有效的4行实现 - 这就是我所需要的:

public static String interpolate(String format, Map<String, ? extends Object> args) {
    String out = format;
    for (String arg : args.keySet()) {
        out = Pattern.compile(Pattern.quote("#{" + arg + "}")).
                matcher(out).
                replaceAll(args.get(arg).toString());
    }
    return out;
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*fel 8

您也可以尝试org.apache.commons.lang3.text.StrSubstitutorJava 7不是一个选项.它完全符合您的要求.它的重量是否轻,可能取决于你是否使用了其他公共场所.