Blok tekstowy Java 13 * BEZ * nowych linii

12

Wieloliniowy blok tekstowy Java 13 z """ogranicznikami staje się dobrze znany.

Mam jednak powtarzającą się potrzebę, w której potrzebuję całych akapitów bez osadzonych znaków nowej linii.

Innymi słowy, następujący fragment kodu:

String paragraph =
    """
    aaaa bbbb cccc
    dddd eeee ffff
    gggg hhhh iiii
    """"
System.out.println(paragraph);

tworzy następujące, jak można się spodziewać:

aaaa bbbb cccc
dddd eeee ffff
gggg hhhh iiii

... co zwykle jest niezwykle przydatne. Jednak w moim przypadku, w przypadku szczególnie dużych akapitów, potrzebuję go do tego:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

(.... i zajmij się przepływem tekstu później.)

Czy istnieje sposób ustalenia parametru „brak nowej linii” dla funkcji potrójnego cudzysłowu?

życie
źródło
Wyobraź sobie, że wpisujesz dużą ilość tekstu, który ma być później częścią dokumentu HTML lub w podobny sposób wprowadzony (powiedzmy) do okna dialogowego o zmiennym rozmiarze. Chcę wejść w wielu „linii” Warto danych bez"line" + "line" + "line" itp i bez EOL pokazano w górę. Unikanie takiej tępej i trudnej do utrzymania składni jest całkowicie w tyle """.
Alife

Odpowiedzi:

16

Projektanci tej funkcji również spełnili to wymaganie (patrz „Nowe sekwencje specjalne” w JEP368). Tak więc dzięki najnowszej kompilacji wczesnego dostępu dla JDK 14 możesz użyć znaku \końca, aby uciec z nowej linii na końcu linii:

public class Main {
    public static void main(String[] args) {
        String paragraph =
            """
            aaaa bbbb cccc \
            dddd eeee ffff \
            gggg hhhh iiii \
            """;
        System.out.println(paragraph);
    }
}

Wydruki:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii
Jorn Vernee
źródło
14, co? Zastanawiam się, jak zadziała łączenie wcięć, czy też cała biała przestrzeń zostanie wyczyszczona?
Alife,
Ale nadal wymagałoby to modyfikacji istniejącego ciągu znaków, który może być na tyle godny, aby bezpośrednio usunąć nowe znaki w tym przypadku.
Naman
3
Hmm, po pierwsze mówią mogąc zamieścić tekst dosłowny jak jest to tak ważna cecha, która uzasadnia zmiany językowe, teraz robi się sekwencje na własną rękę, a ja muszę się zastanawiać, co jest zaletą w porównaniu oddanie "aaaa bbbb cccc ", +"dddd eeee ffff "i +"gggg hhhh iiii "każdy w wyraźnej linii…
Holger
@Holger Funkcja została podzielona na 2; bloki tekstowe (znane również jako ciągi wielowierszowe) oraz literały nieprzetworzone (tj. ciąg taki, jaki jest, czyli tbd). To tylko ten pierwszy. Zauważ, że inne \nznaki ucieczki nadal działają w blokach tekstowych.
Jorn Vernee,
1
Ale teraz, gdy mamy readString, osadzone zasoby są o wiele łatwiejsze w obsłudze. Nigdy nie chciałem integrować całych akapitów z kodem źródłowym, tylko rzeczy we / wy były denerwujące.
Holger,
4

Możesz używać String.lineswprowadzonego od Java-11 jako:

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

Uzupełnieniem i za co warto, oto zrzut ekranu z wykonania JShell dwóch różnych bloków kodu:

wprowadź opis zdjęcia tutaj

Naman
źródło
3
… Co robi to samo coString output = paragraph.replaceAll("[\n\r]", "");
Holger
I żadne z rozwiązań (do czasu modyfikacji przez JDK-14 dopuszczania \sw """bloku) pozwala mi mieszać wiersze bez EOL z liniami, w których tak naprawdę chcę twardego powrotu (np. Między akapitami itp.)
alife
1

Rzeczywiście, znalezienie dobrej odpowiedzi w Javie 13 nie jest łatwe (może nawet niemożliwe), ale myślę, że Jorn Vernee z wdzięcznością zajął się tym problemem w swojej odpowiedzi (nowe sekwencje specjalne w Javie 14 stanowią akceptowalne rozwiązanie).

Aby rozwinąć kilka wymienionych problemów:

  • Holger wspomina, że ​​„funkcja bloków tekstowych nie jest zbyt przekonująca”. Widziałem dużo „brzydkiego” kodu, który sztucznie łączy łańcuch, więc myślę, że ta funkcja zdecydowanie rozwiązuje problem . Z drugiej strony muszę się zgodzić, że taka funkcja pozostawia wiele miejsca na nadużycia (jak w „wstawmy dużo tekstu w kodzie Java, ponieważ teraz możemy to ładnie zrobić!” - patrz następny punkt ).
  • W pierwotnym pytaniu wspomniano o „dużych akapitach”, które sugerują, że w ogóle nie używam tej funkcji, ale przekazuję tę zawartość do plików zasobów.
  • O jasności i tym, że pewne aspekty „nie są oczywiste dla czytelnika, więc mamy składnię o nieoczywistym znaczeniu”. Jest to częściowo poprawne i wymaga trochę czytania i eksperymentów, podczas gdy dostępny materiał nie jest obecnie tak szeroki. Znalazłem to: Przewodnik programisty po blokach tekstowych , który zawiera całkiem sporo przykładów. Napisałem też kilka przykładów, jeden z bloków tekstowych: TextBlocks.java - mam nadzieję, że te pomogą.

Uwaga dla moderatora: Wiem, że ta odpowiedź potencjalnie narusza wytyczne (nie odnoszę się do pytania i odpowiadam na komentarze innych użytkowników), ale myślę, że powinna istnieć przestrzeń do dyskusji na tematy, które wciąż trwają (nie zapominajmy, że bloki tekstowe są w trybie „drugiego podglądu” ).

Chris T.
źródło
0

paragraph.replaceAll("\\n","") powinien wykonać dla ciebie pracę.

Guillaume
źródło
Intellij ma teraz awarię z powodu używania przeze mnie znaków specjalnych na końcu linii. Być może jednak najlepszym rozwiązaniem byłoby """ line line line """.replaceAll("\\n",""); nie można tego teraz zweryfikować.
alife
Przypuszczam, że istnieje również (niewielki) problem, że jest to obsługiwane w czasie wykonywania, a nie w czasie kompilacji, ale nie jest to wymagane dla moich celów.
Alife,
To rozwiązanie również nie do końca osiąga \szdolność JDK-14. Co jeśli chcę kilka akapitów bez podziałów linii, ale między wierszami.
alife