Текстовый блок с тройными кавычками Java 13 * БЕЗ * новой строки
Средство многострочного текстового блока Java 13 с """
разделители становятся широко известными.
Однако у меня есть повторяющаяся потребность, когда мне нужны целые абзацы без встроенных символов новой строки.
Другими словами, следующий фрагмент кода:
String paragraph =
"""
aaaa bbbb cccc
dddd eeee ffff
gggg hhhh iiii
"""
System.out.println(paragraph);
производит следующее, как и следовало ожидать:
aaaa bbbb cccc
dddd eeee ffff
gggg hhhh iiii
... что обычно чрезвычайно полезно. Однако в моем случае для особенно больших абзацев мне нужно, чтобы это произвело следующее:
aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii
(.... и разберемся с потоком текста позже.)
Есть ли способ установить параметр "без новой строки" для функции тройных кавычек?
5 ответов
Разработчики этой функции также осознали это требование (см. "Новые escape-последовательности" в JEP368). Итак, с последней сборкой раннего доступа для JDK 14 вы можете использовать конечный\
чтобы избежать новой строки в конце строки:
public class Main {
public static void main(String[] args) {
String paragraph =
"""
aaaa bbbb cccc \
dddd eeee ffff \
gggg hhhh iiii \
""";
System.out.println(paragraph);
}
}
Печать:
aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii
Вы можете использовать String.lines
введен с Java-11 как:
String output = paragraph.lines().collect(Collectors.joining());
В качестве дополнения и того, что того стоит, вот скриншот выполнения JShell двух разных блоков кода:
Действительно, найти хороший ответ в Java 13 непросто (может быть, даже невозможно), но я думаю, что Йорн Верни изящно отреагировал на эту проблему в своем ответе (новые escape-последовательности в Java 14 обеспечивают приемлемое решение).
Чтобы подробнее остановиться на нескольких перечисленных проблемах:
- Хольгер упоминает, что "функция" текстовых блоков "не очень убедительна". Я видел много "уродливого" кода, который выполняет искусственную конкатенацию строк, поэтому я думаю, что эта функция определенно решает проблему. С другой стороны, я должен согласиться с тем, что такая функция оставляет много места для злоупотреблений (например, "давайте поместим много текста в код Java, потому что теперь мы можем это сделать красиво!" - см. Следующий пункт).
- В исходном вопросе упоминаются "большие абзацы", которые заставляют меня советовать не использовать эту функцию вообще, а перенести этот контент в файлы ресурсов.
- О ясности и о том, что некоторые аспекты "не очевидны для читателя, поэтому у нас есть синтаксис с неочевидным значением". Это отчасти верно, и для этого нужно немного прочитать и поэкспериментировать, хотя доступный материал на данный момент не так велик. Я нашел это: Руководство программиста по текстовым блокам, в котором есть довольно много примеров. Я также написал несколько примеров, пример с текстовыми блоками здесь: TextBlocks.java - надеюсь, это поможет.
Примечание для модератора: я знаю, что этот ответ потенциально нарушает руководство (я не отвечаю на вопрос и отвечаю на комментарии других пользователей), но я думаю, что должно быть место для обсуждения тем, которые все еще находятся в стадии разработки (не забываем, что текстовые блоки находятся в режиме "второго предварительного просмотра").
paragraph.replaceAll("\\n","")
должен сделать всю работу за вас.
Почему бы просто не протянуть его через сканер:
String strip(String multiline){
var scanner = new java.util.Scanner(multiline);
var text = scanner.next();
while (scanner.hasNext()) text += " "+ scanner.next();
return text;
}