¿Existe una implementación estándar o al menos extendida de algo como String.format
, pero con argumentos con nombre?Java string templatizer/formatter con argumentos con nombre
me gustaría dar formato a una cadena a plantillas de una manera como esa:
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"
Técnicamente, es casi lo mismo que:
String[] args = new String[] { "/usr/bin", "foo" };
String s = String.format("%1$s/ls %2$s", args);
// "/usr/bin/ls foo"
pero con argumentos con nombre.
yo sepa:
pero todos ellos utilizan ordenado o al menos argumentos, que no se llame contados. Sé que es trivial implementar uno, pero ¿hay algún mecanismo que esté buscando en las bibliotecas estándar de Java o al menos en Apache Commons/Guava/algo similar, sin incluir motores de plantillas de alto perfil?
NOTA: No estoy realmente interesado en motores de plantilla en toda regla, con características como algo de lógica imperativa/funcionales, control de flujo, modificadores, sub-templates/inclusiones, iteradores, etc. En general, el siguiente método es una aplicación de 4 líneas de trabajo - que es todo lo que necesita:
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;
}
¿Alguna razón por la que no solo está utilizando "#" + args.get ("RUTA") + "/ ls #" + args.get ("archivo")? – Charles
Tengo un montón de archivos de plantilla, tengo un mapa de argumentos y necesito obtener cadenas completas de cada uno de estos archivos de plantilla. – GreyCat