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

Дизайнери цієї функції також усвідомили цю вимогу (див. "Нові послідовності втечі" в 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 непросто (можливо, навіть неможливо), але я думаю, що Джорн Верні виступив із проблемою витончено у своїй відповіді (нові послідовності виходу на Java 14 забезпечують прийнятне рішення).

Щоб розширити кілька перерахованих проблем:

  • Холгер зазначає, що "текстові блоки" не дуже переконливі ". Я бачив багато "некрасивих" код, який робить штучне з'єднання рядків, тому я думаю, що ця функція точно вирішує проблему . З іншого боку, я маю згоду з тим, що така функція залишає багато місця для зловживань (як у "давайте помістимо багато тексту в код Java, тому що тепер ми можемо це добре зробити" - див. Наступний пункт ).
  • В оригінальному запитанні згадуються "великі абзаци", які дають мені поради взагалі не використовувати цю функцію, а екстерналізувати цей вміст до файлів ресурсів.
  • Про чіткість і про те, що певні аспекти "не очевидні для читача, тому ми маємо синтаксис із неочевидним значенням". Це частково правильно, і для цього потрібне певне читання та експерименти, тоді як наявний матеріал на сьогодні не такий великий. Я знайшов це: Посібник програміста з текстових блоків , який надає досить багато прикладів. Я також є автором декількох прикладів, цей текстовий блок знаходиться тут: TextBlocks.java - сподіваюся, вони допоможуть.

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


0

paragraph.replaceAll("\\n","") повинен зробити роботу за вас.


Intellij зараз перебуває у певній аварійній петлі через моє використання символів втечі в кінці рядка. Можливо, що було б найкраще - це """ line line line """.replaceAll("\\n",""); не можу зараз перевірити.
Alife

Я припускаю, що є також (другорядне) питання, що це обробляється під час виконання, а не під час компіляції, але це не є вимогою для моїх цілей.
Alife

Це рішення також не може повністю досягти \sможливостей JDK-14. Що робити, якщо я хочу кілька абзаців без розривів рядків, але між ними перерви рядків.
Alife
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.