Текстовый блок 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.