Как лучше всего параметризовать строку

Например у меня есть:

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());
}

Есть ли способ лучше?

Каким будет лучший (надежный, ремонтопригодный, эффективный по времени и т. д.) Способ получить желаемый результат? - Чтобы не изобретать велосипед.
BackSlash 17.09.2018 08:56

Ничего плохого в вашей текущей попытке. Что вы здесь ищете? Обратите внимание, что уже существуют библиотеки шаблонов Java, которые могут это сделать.

Tim Biegeleisen 17.09.2018 08:56

А еще есть встроенное решение с использованием printf(...)

Turing85 17.09.2018 08:58

Как насчет "Hi " + var1 + " Bye " + var2 + " !! "

Nicholas K 17.09.2018 08:58

Вы можете использовать встроенный String.format().

Maciej Mościcki 17.09.2018 08:58

@ Turing85 Он не поддерживает именованные параметры, о чем, я думаю, просит OP

BackSlash 17.09.2018 08:59

всем: Сначала изучите задание. Перед постановкой вопроса.

Valentyn Hruzytskyi 17.09.2018 09:02

Тим прав: например, Freemarker делает именно это. Его успешно использовали многие очень крупные компании.

Bohemian 17.09.2018 09:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
8
1 290
4

Ответы 4

Зависит от того, насколько сложная система шаблонов вам нужна. Их уже много.

Вот два примера:

Другой способ - использовать 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 уже делает это. Единственное отличие состоит в том, что вместо этого он избегает жесткого кодирования имен параметров.

BackSlash 17.09.2018 09:29

Помимо решений, уже предоставленных в других ответах, вы также можете использовать 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);

Другие вопросы по теме