Текстовый блок Java 13 * БЕЗ * перевода строки


12

Средство многострочного текстового блока 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

(.... и разберись с потоком текста позже.)

Есть ли способ установить параметр "без новой строки" для функции тройной кавычки?


Представьте, что вы вводите большое количество текста, который позже станет частью HTML-документа или аналогичным образом перетекут в (скажем) диалоговое окно с изменяемым размером. Я хочу ввести данные во многих «строках» без и "line" + "line" + "line"т. Д. И без отображения EOL. Избегание такого тупого и сложного в использовании синтаксиса - все дело в этом """.
— Alife

Ответы:


16

Разработчики этой функции также осознали это требование (см. «Новые 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

14, а? Интересно, как сработает объединение отступов, или если все пустое пространство будет стерто?
— Alife

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

3
Хм, сначала они говорят , что возможность встраивать буквальный текст как есть такая важная функция , которая оправдывает изменения языка, теперь он получает управляющие последовательности самой по себе, и я должен задаться вопрос, в чем преимущество перед сдачей "aaaa bbbb cccc ", +"dddd eeee ffff "и +"gggg hhhh iiii "каждое в отдельной строке ...
— Хольгер

@Holger Функция была разделена на 2; текстовые блоки (также называемые многострочными строками) и необработанные строковые литералы (т. е. строка как есть, то есть tbd). Это только первое. Обратите внимание, что другие экранирования, например \n, по-прежнему работают в текстовых блоках.
— Верни

1
Но теперь, когда у нас есть readString, встроенные ресурсы гораздо проще обрабатывать. Я никогда не хотел интегрировать целые абзацы в исходный код, меня раздражали только вещи ввода / вывода.
— Хольгер

4

Вы можете использовать String.linesвведенный начиная с Java-11 как:

String output = paragraph.lines().collect(Collectors.joining());

Вот бесплатный пример того, как JShell выполняет два разных блока кода:

введите описание изображения здесь


3
... который делает то же самое, чтоString output = paragraph.replaceAll("[\n\r]", "");
— Хольгер

И не от решений (до JDK-14 модификация позволяет \sв """блоке) не позволяет мне перемешивать EOL-меньше линий с линиями , где я на самом деле хочу жесткий возврат (например, между пунктами, и т.д.)
— ALIFE

1

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

Чтобы расширить некоторые перечисленные проблемы:

  • Хольгер упоминает, что «функция« текстовых блоков »не очень убедительна». Я видел много «уродливого» кода, который выполняет искусственную конкатенацию строк, поэтому я думаю, что эта функция определенно решает проблему . С другой стороны, я должен согласиться с тем, что подобная функция оставляет много места для злоупотреблений (например, «давайте поместим много текста в код Java, потому что теперь мы можем это сделать!» - см. Следующий пункт ).
  • В первоначальном вопросе упоминаются «большие абзацы», из-за которых я советую вообще не использовать эту функцию, а выводить этот контент в файлы ресурсов.
  • О ясности и о том, что определенные аспекты «не очевидны для читателя, поэтому у нас есть синтаксис с неочевидным значением». Это отчасти правильно, и это требует некоторого чтения и экспериментов, в то время как доступные материалы не так уж и обширны в данный момент. Я нашел это: Руководство программиста по текстовым блокам , которое содержит довольно много примеров. Я также написал несколько примеров, один из которых находится на текстовых блоках здесь: TextBlocks.java - надеюсь, они помогут.

Примечание для модератора: я знаю, что этот ответ потенциально нарушает правила (я не отвечаю на вопрос и отвечаю на комментарии других пользователей), но я думаю, что должно быть место для дебатов по темам, которые все еще находятся в процессе разработки (давайте не будем забывать, что текстовые блоки находятся в режиме «второго предварительного просмотра» ).


0

paragraph.replaceAll("\\n","") должен сделать работу за вас.


Intellij сейчас находится в каком-то цикле сбоя из-за моего использования escape-символов в конце строки. Возможно, что было бы лучше, так это """ line line line """.replaceAll("\\n",""); не могу проверить это сейчас.
— Alife

Я предполагаю, что есть также (незначительная) проблема, что это обрабатывается во время выполнения, а не во время компиляции, но это не требование для моих целей.
— Alife

Это решение также не вполне может достичь \sJDK-14. Что делать, если я хочу несколько абзацев без разрывов строк, но между ними разрывы строк.
— Alife
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.