Вставка строки Java в другую строку без конкатенации?

Есть ли более элегантный способ сделать это на Java?

String value1 = "Testing";  
String test = "text goes here " + value1 + " more text";

Можно ли поместить переменную непосредственно в строку и оценить ее значение?

Ответ 1

   String test = String.format("test goes here %s more text", "Testing");

- самая близкая вещь, которую вы могли бы написать в Java

Ответ 2

Более элегантный способ может быть:

 String value = "Testing"; 
 String template = "text goes here %s more text";
 String result = String.format(template, value);

Или, альтернативно, используя MessageFormat:

 String template = "text goes here {0} more text";
 String result = MessageFormat.format(template, value);

Обратите внимание, что если вы делаете это для ведения журнала, вы можете избежать затрат на выполнение этого, когда строка журнала будет ниже порога. Например, SLFJ:

Следующие две строки приведут к тому же самому результату. Тем не менее, вторая форма будет превосходить первую форму не менее чем в 30 раз в случае отключенной записи журнала.

logger.debug("The new entry is "+entry+".");
logger.debug("The new entry is {}.", entry);

Ответ 3

Rythm java template engine теперь выпущен с новой функцией Режим интерполяции строк, который позволяет вам делать что-то вроде

String result = Rythm.render("Hello @who!", "world");

В приведенном выше примере вы можете передать аргумент шаблону по позиции. Rythm также позволяет передавать аргументы по имени:

Map<String, Object> args = new HashMap<String, Object>();
args.put("title", "Mr.");
args.put("name", "John");
String result = Rythm.render("Hello @title @name", args);

Ссылки:

Ответ 4

Это может быть сделано с помощью некоторых шаблонов. Но будьте осторожны, Строки неизменны в Java. Поэтому в каждом случае на некотором низком уровне будет выполняться конкатенация.

Ответ 5

Вам всегда нужно использовать некоторую форму конкатенации (если значение1 не является константой, как показано здесь).

То, как вы его написали, неявно построит StringBuilder и использует его для объединения строк. Другим методом является String.format(String, Object...) 1 что аналогично sprintf из C. Но даже с format(), вы не можете избежать конкатенации.

1 Да, я знаю, что ссылка на якорь сломана.

Ответ 6

То, что вы хотите, называется Строковая интерполяция. Это невозможно в Java, хотя JRuby, Groovy и, возможно, другие языки JVM делают это.


Изменить: как для элегантности вы можете использовать StringBuffer или проверить другое плакатное решение. Но на низком уровне это всегда будет конкатенация, как говорили другие плакаты.

Ответ 7

Вы можете использовать эту бесплатную библиотеку. Это дает вам функциональность sprintf. Или используйте String.format статический метод, если вы используете Java 5 или новее.

Ответ 8

Почему вы считаете, что конкатенация строк не изящна?

Если все, что вы делаете, это простая конкатенация, я бы утвердил, что читаемость кода важнее, и я оставил бы ее, как у вас. Это более читаемо, чем использование StringBuilder.

Производительность не будет проблемой, о которой думают многие.

Прочтите это из CodingHorror

Ответ 9

Я бы использовал StringBuffer. Это обычная практика, когда вы имеете дело со строками. Это может показаться немного, когда вы видите его в первый раз, но вы быстро привыкнете к нему.

String test = new StringBuffer("text goes here ").append(value1).append(" more text").toString();

Строки неизменяемы, поэтому после каждого конкатенации создается новый экземпляр. Это может вызвать проблемы с производительностью при использовании в циклах.

StringBuffer - изменяемая версия String. Это значит, что вы можете ее создать, изменить, как хотите, и у вас есть только один экземпляр. По желанию вы можете получить строковое представление StringBuffer, вызывая его toString().

Ответ 10

Проблема не в том, что это элегантный способ или нет. Идея использования системы шаблонов может заключаться в том, что вы помещаете свой шаблон в обычный текстовый файл и не должны изменять код Java, если вы меняете свое сообщение (или думаете об i18ln).