Текстовый блок с тройными кавычками 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;
   }
Другие вопросы по тегам