Например у меня есть:
String templateString = "Hi {{customerName}}, you have successfully ordered a {{itemName}}."
Map<String, String> parameters = new HashMap<>();
parameters.put("customerName", "Bob");
parameters.put("itemName", "sofa");
Желаемый результат:
"Hi Bob, you have successfully ordered a sofa."
Каким будет лучший (надежный, ремонтопригодный, эффективный по времени и т. д.) Способ получить желаемый результат?
Я подумал сделать что-нибудь простое:
String output = templateString;
for (Map.Entry<String, String> entry : parameters.entrySet()) {
output = output.replace("{{" + entry.getKey() + "}}", entry.getValue());
}
Есть ли способ лучше?
Ничего плохого в вашей текущей попытке. Что вы здесь ищете? Обратите внимание, что уже существуют библиотеки шаблонов Java, которые могут это сделать.
Как насчет "Hi " + var1 + " Bye " + var2 + " !! "
Вы можете использовать встроенный String.format().
@ Turing85 Он не поддерживает именованные параметры, о чем, я думаю, просит OP
всем: Сначала изучите задание. Перед постановкой вопроса.
Тим прав: например, Freemarker делает именно это. Его успешно использовали многие очень крупные компании.




Зависит от того, насколько сложная система шаблонов вам нужна. Их уже много.
Вот два примера:
Другой способ - использовать Mustache.java, документы
String templateString = "Hi {{customerName}}, you have successfully ordered a {{itemName}}.";
Map<String, String> parameters = new HashMap<>();
parameters.put("customerName", "Bob");
parameters.put("itemName", "sofa");
Writer writer = new StringWriter();
MustacheFactory mf = new DefaultMustacheFactory();
Mustache mustache = mf.compile(new StringReader(templateString), "example");
mustache.execute(writer, parameters);
writer.flush();
System.out.println(writer.toString());
Было бы лучше получать значения с помощью ключей на карте
String output = templateString;
output = output.replace("{{customerName}}",parameters.get("customerName"));
output = output.replace("{{itemName}}",parameters.get("itemName"));
OP уже делает это. Единственное отличие состоит в том, что вместо этого он избегает жесткого кодирования имен параметров.
Помимо решений, уже предоставленных в других ответах, вы также можете использовать StringSubstitutor из Текст Apache Commons.
Пример из https://commons.apache.org/proper/commons-text/javadocs/api-release/org/apache/commons/text/StringSubstitutor.html: -
Map valuesMap = HashMap();
valuesMap.put("animal", "quick brown fox");
valuesMap.put("target", "lazy dog");
String templateString = "The ${animal} jumps over the ${target}.";
StringSubstitutor sub = new StringSubstitutor(valuesMap);
String resolvedString = sub.replace(templateString);