Основы 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, которая предоставляет множество функций для создания многострочных строк. Добавление этого в ваш код определенно сделает ваш код более читаемым и чистым. Начните экспериментировать и получайте удовольствие!