Основы Java

Текстовые блоки в Java

Лучший способ создавать многострочные строки без добавления подробного кода

Java по сравнению с другими языками программирования немного многословен. Многим людям и компаниям нравится использовать Java в своей производственной среде из-за доступной поддержки и навыков. Тем не менее, это один из самых старых языков программирования, Java за последние несколько лет увеличила свои темпы. Помимо повышения производительности, он также добавил функции, которые обычно не связаны с Java, например лямбды. Благодаря таким новым функциям он пытается упростить работу программиста, а также сделать код менее подробным. Одна из таких попыток - ввести «текстовые блоки», запущенные как предварительная версия в JDK 13 и 14. Планируется выйти из предварительной версии в JDK 15, которая будет выпущена в сентябре 2020 года, а выпуск OpenJDK - в марте 21 года. Тем не менее, если вы используете JDK 13 или 14, вы все равно можете использовать эту удобную функцию.

Многострочные струны

Многострочная строка - это блок текста, который занимает несколько строк. Чтобы создать это, вам нужно добавить к тексту разделители строк, чтобы компилятор понимал, как отображать эту строку.

String myMultiLineText = "This is first line of my multi-line string.\nI'm on second line now";

Это даст следующий результат:

This is first line of my multi-line string.
I'm on second line now!

Здесь, добавляя «\ n», я добавляю новую строку к строке. Но на самом деле разделитель строк зависит от операционной системы. Итак, если вы используете Windows / Mac OS 9 или более раннюю версию, вам, возможно, придется использовать «\ r» или «\ r \ n» в качестве escape-последовательности.

Windows: '\r\n'
Mac (OS 9-): '\r'
Mac (OS 10+): '\n'
Unix/Linux: '\n'

Теперь, чтобы сделать мой код более универсальным, я должен учитывать такие случаи. В Java есть способ получить разделитель строк из свойств системы. Вот обновленный код -

String newLineChar = System.getProperty("line.separator");
String myMultiLineText = "This is first line of my multi-line string."+newLineChar+"I'm on second line now";

Хорошо, очень быстро мой простой код стал более многословным и выглядел загроможденным. Представьте себе многострочную строку с большим количеством (›5) строк! Не так-то просто для глаз, правда. Мы можем использовать методы String, такие как concat, join или использовать библиотеки, такие как StringBuilder, Guava Joiner, чтобы сделать его немного чище.

Использование String concat / join

String myMultiLineTextUsingConcat = "first line"
.concat(newLineChar)
.concat("second line");
String myMultiLineTextUsingJoin = String.join(newLineChar, "first line", "second line");

Использование StringBuilder

StringBuilder myMultiLineStringBuilder = new StringBuilder()
.append("first line")
.append(newLineChar)
.append("second line")
.toString();

Использование Guava Joiner

String myMultiLineTextUsingGuavaJoiner = Joiner.on(newLineChar)
.join(ImmutableList.of("first line", "second line"));

Итак, есть много способов создать такие многострочные строки, где в зависимости от варианта использования один может быть лучше другого. Но вы можете видеть, что ни один из них, выглядящий чистым или легко читаемым, не может привести к большему количеству ошибок в коде.

Текстовые блоки

Функция текстовых блоков позволяет вам создавать многострочные строки интуитивно понятным способом, как и должно быть.

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

Наша многострочная строка теперь становится-

String myMultiLineText = """
                         first line
                         second line
                         """;

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

В отличие от символов строкового литерала содержимое может включать символы двойных кавычек напрямую. Использование \" в текстовом блоке разрешено, но не обязательно и не рекомендуется. Жирные разделители (""") были выбраны так, чтобы символы " могли отображаться без экранирования, а также чтобы визуально отличать текстовый блок от строкового литерала.

Во время выполнения текстовый блок оценивается как экземпляр String, как строковый литерал. Экземпляры String, полученные из текстовых блоков, неотличимы от экземпляров, полученных из строковых литералов.

Отступ

Обратите внимание на отступ, который я сделал для своей строки, чтобы получить желаемый интервал в моем выводе. Это дает следующий вывод:

first line
second line

Однако, если я хочу добавить пробел во вторую строку. Я могу сделать это-

String myMultiLineText = """
                         first line
                          second line
                         """;

В зависимости от того, где начинается начало с разделителями, компилятор пытается понять намерение в интервале, чтобы вы могли правильно сделать отступ в коде, а также добавить пробелы в текстовый блок. Представьте, что вы создаете HTML-код в строке -

String html = """
              <html>
                  <body>
                      <p>Hello, world</p>
                  </body>
              </html>
              """;

Выходные данные не содержат лишних пробелов в начале, а также ваш код имеет правильный отступ.

<html>
    <body>
        <p>Hello, world</p>
    </body>
</html>

Вот пример HTML с использованием точек для визуализации пробелов, добавляемых для отступов:

String html = """
..............<html>
..............    <body>
..............        <p>Hello, world</p>
..............    </body>
..............</html>
..............""";

Все эти точки удаляются во время обработки во время компиляции, что компилятор предполагает, что вы добавили их для отступа в коде.

Форматирование

Часто вам нужно вставить значения времени выполнения в свою строку, например:

String welcomeText = String.format("Welcome, %s !", name);

Вы все еще можете использовать метод формата String для форматирования текстового блока -

String welcomeText = String.format("""
                                   Welcome, %s !
                                   """, name);

Чтобы избежать таких многословных конструкций, существует новый метод formatted, который может с этим помочь.

String welcomeText = """
                     Welcome, %s !
                     """.formatted(name);

Намного лучше, верно!

Заключение

В целом, текстовые блоки - отличная функция в Java, которая предоставляет множество функций для создания многострочных строк. Добавление этого в ваш код определенно сделает ваш код более читаемым и чистым. Начните экспериментировать и получайте удовольствие!