Форматирование текстовых блоков Java с помощью переменных/выражений

Текстовые блоки Java — это многострочные строки, завершенные в Java 15. Текстовый блок позволяет избежать необходимости в большинстве управляющих последовательностей, сохраняя отступы и форматирование нетронутыми. Этот учебник Java научит нас применять интерполяцию строк(подстановку переменных) в текстовых блоках.

Хотя у вас может возникнуть соблазн использовать конкатенацию строк для форматирования текстового блока с переменными и выражениями, не пытайтесь этого делать. Вместо этого используйте метод String.formatted(), специально разработанный для этой цели.

1. Форматирование текстового блока с помощью String.formatted()

Это наиболее чистый и рекомендуемый способ форматирования текстовых блоков с переменными. Он возвращает отформатированную строку, используя указанную строку формата(текстовый блок) и аргументы(переменные).

Рассмотрим следующий пример. Здесь мы форматируем строку JSON с переменными во время выполнения:

целочисленный идентификатор = 1001;Имя строки = "Джон Доу";целочисленный возраст = 34;Строка текстБлок = """{"идентификатор": %d,"имя": "%s","возраст": %d}""";Строка formattedTextBlock = textBlock.formatted(id, name, age);System.out.println( formattedTextBlock );

Вывод программы:

{"id": 1001,"name": "John Doe","age": 34}

Если число переменных очень велико, то передача всех переменных как varargs может показаться нецелесообразной. В этом случае мы можем передать переменные форматирования как Object[].

 Объект[] formatArguments = {1001, // идентификатор"Джон Доу", // имя34 // возраст};Строка formattedTextBlock2 = textBlock.formatted(formatArguments);System.out.println( formattedTextBlock2 );

Вывод программы:

 {"id": 1001,"name": "John Doe","age": 34} 

Метод formatted внутренне вызывает метод String.format(string, args). Поэтому мы можем вызвать его явно, если он нам понадобится в любом случае.

Строка отформатированаTextBlock = String.format(textBlock, formatArguments);//... ИЛИСтрока formattedTextBlock = String.format(textBlock, id, name, age);

2. Форматирование текстового блока с помощью MessageFormat.format()

Если вы ищете локализованный контент и сложные шаблоны, но при этом не слишком много для простых случаев использования, MessageFormat.format() — надежный выбор. Обратите внимание, что использование MessageFormat не так просто, как метод String.format(). Мы должны быть очень осторожны с конкретными шаблонами форматирования в текстовом блоке.

Например, если в вашей локали по умолчанию в качестве разделителей тысяч используются запятые, то отправка этого значения поля без двойных кавычек приведет к созданию недопустимого JSON(в нашем случае).

 Строка json = """'{'"id": {0, число, #},"имя": "{1}","зарплата": "{2, число, целое число}"'}'""";Объект[] аргументы = {1001, // идентификатор"Джон Доу", // имя34000 // зарплата};Строка formattedTextBlock3 = MessageFormat.format(json, arguments);System.out.println(форматированныйТекстБлок3);

Вывод программы:

{"id": 1001,"name": "John Doe","salary": "34,000"}

При использовании MessageFormat следует очень тщательно тестировать все возможности генерируемых форматированных строк.

3. Конкатенация строк(не пытайтесь)

Давайте попробуем использовать интерполяцию в простом текстовом блоке и посмотрим на результат.

 Имя строки = "Джон Доу";Строка приветствия = """Привет, """ + имя + """Добро пожаловать в текстовые блоки Java!""";System.out.println(приветствие);

Вывод программы:

Hello,John DoeWelcome to Java text blocks!

Почему мы потеряли новую строку? Ну, текстовые блоки сохраняют точное форматирование и отступы, как они появляются в исходном коде. Но приведенное выше выражение не является интерполяцией, это конкатенация 3 строк. Первый и третий — текстовые блоки, а второй — простая строка со значением переменной name во время выполнения.

Имя переменной присоединяется непосредственно после «Hello,» без пробела или символа новой строки. Аналогично, «Welcome to Java text blocks!» присоединяется непосредственно после имени без новой строки или пробела. То есть конечный вывод — одна строка.

Добавление escape-последовательностей в текстовые шаблоны для достижения желаемого результата — очень громоздкий процесс, который того не стоит. Лучше придерживаться метода formatted().

4. Заключение

Текстовые блоки Java значительно упростили обработку многострочных строк. Включение переменных или выражений в текстовые блоки, хотя и не так просто, как в некоторых других языках, может быть эффективно достигнуто с помощью метода String.formatted(). Для форматирования, чувствительного к локали, мы можем использовать метод MessageFormat.format().

Исходный код на Github

Прокрутить вверх