Java 13 Textblock * OHNE * Zeilenumbrüche

12

Die mehrzeilige Java 13-Textblockfunktion mit """Trennzeichen wird immer bekannter.

Ich habe jedoch einen wiederkehrenden Bedarf, bei dem ich ganze Absätze ohne die eingebetteten Zeilenumbrüche benötige.

Mit anderen Worten, das folgende Code-Snippet:

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

erzeugt wie erwartet Folgendes:

aaaa bbbb cccc
dddd eeee ffff
gggg hhhh iiii

... was normalerweise enorm nützlich ist. In meinem Fall benötige ich es jedoch für besonders große Absätze, um Folgendes zu erstellen:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

(.... und später mit dem Textfluss umgehen.)

Gibt es eine Möglichkeit, einen "No-Newline" -Parameter für die Funktion mit dreifachen Anführungszeichen festzulegen?

ein Leben
quelle
Stellen Sie sich vor, Sie geben eine große Textmenge ein, die später Teil eines HTML-Dokuments sein oder auf ähnliche Weise in ein Dialogfeld mit veränderbarer Größe fließen soll. Ich möchte Daten im Wert von "Zeilen" eingeben, ohne dass"line" + "line" + "line" usw. und ohne dass die EOLs angezeigt werden. Das Vermeiden einer solchen stumpfen und schwer zu pflegenden Syntax ist der eigentliche Punkt dahinter """.
Alife

Antworten:

16

Die Entwickler dieser Funktion haben diese Anforderung ebenfalls erkannt (siehe 'Neue Escape-Sequenzen' in JEP368). Mit dem neuesten Early Access Build für JDK 14 können Sie also ein Trailing verwenden \, um die neue Zeile am Ende einer Zeile zu umgehen:

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

Drucke:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii
Jorn Vernee
quelle
14, was? Ich frage mich, wie die Verkettung des Einrückens funktioniert oder ob der gesamte Leerraum sauber gewischt wird.
Leben
Dies würde jedoch immer noch eine Änderung der vorhandenen Zeichenfolgeneingabe erfordern, die möglicherweise gerade ausreichend ist, um in diesem Fall die Zeilenumbrüche selbst direkt zu entfernen.
Naman
3
Hmm, zuerst sagen sie, dass die Möglichkeit, wörtlichen Text so wie er ist einzubetten, ein so wichtiges Merkmal ist, dass er Sprachänderungen rechtfertigt. Jetzt werden Escape-Sequenzen für sich erstellt, und ich muss mich fragen, was der Vorteil gegenüber dem Putten "aaaa bbbb cccc "ist +"dddd eeee ffff ", und +"gggg hhhh iiii "jeder in einer bestimmten Linie…
Holger
@Holger Die Funktion wurde in 2 geteilt; Textblöcke (auch als mehrzeilige Zeichenfolgen bezeichnet) und rohe Zeichenfolgenliterale (dh Ist-Zeichenfolge, dh tbd). Dies ist nur der erstere. Beachten Sie, dass andere Escapezeichen \nweiterhin in Textblöcken funktionieren.
Jorn Vernee
1
Aber jetzt, wo wir es haben readString, sind eingebettete Ressourcen auch viel einfacher zu handhaben. Ich wollte nie ganze Absätze in den Quellcode integrieren, nur das E / A-Zeug war nervig.
Holger
4

Sie können String.lineseingeführt seit Java-11 verwenden als:

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

Ein kostenloser und für das, was es wert ist, hier ein Screenshot von der JShell-Ausführung der beiden verschiedenen Codeblöcke:

Geben Sie hier die Bildbeschreibung ein

Naman
quelle
3
… Was dasselbe tut wieString output = paragraph.replaceAll("[\n\r]", "");
Holger
Und keine der Lösungen (bis zu JDK-14s Änderung des Zulassens \sim """Block) ermöglicht es mir, EOL-freie Zeilen mit Zeilen zu
mischen, in
1

In Java 13 ist es zwar nicht einfach (vielleicht sogar unmöglich), eine gute Antwort zu finden, aber ich denke, Jorn Vernee hat das Problem in seiner Antwort anmutig angesprochen (neue Escape-Sequenzen in Java 14 bieten eine akzeptable Lösung).

So erweitern Sie einige der aufgeführten Probleme:

  • Holger erwähnt "die Funktion" Textblöcke "ist nicht sehr überzeugend". Ich habe viel "hässlichen" Code gesehen, der künstliche Zeichenfolgenverkettung ausführt, daher denke ich, dass die Funktion definitiv ein Problem behebt . Auf der anderen Seite muss ich zustimmen, dass eine Funktion wie diese viel Raum für Missbrauch lässt (wie in "Lassen Sie uns viel Text in den Java-Code einfügen, denn jetzt können wir es gut machen!" - siehe den nächsten Punkt ).
  • In der ursprünglichen Frage werden "große Absätze" erwähnt, die mir raten, diese Funktion überhaupt nicht zu verwenden, sondern diesen Inhalt in Ressourcendateien zu verlagern.
  • Über die Klarheit und dass bestimmte Aspekte "für den Leser nicht offensichtlich sind, so dass wir eine Syntax mit einer nicht offensichtlichen Bedeutung haben". Das ist teilweise richtig, und es erfordert etwas Lesen und Experimentieren, während das verfügbare Material in diesem Moment nicht so groß ist. Ich habe Folgendes gefunden: Programmierhandbuch für Textblöcke , das eine ganze Reihe von Beispielen enthält. Ich habe auch einige Beispiele verfasst, das hier zu Textblöcken: TextBlocks.java - hoffentlich helfen diese.

Hinweis für den Moderator: Ich weiß, dass diese Antwort möglicherweise gegen die Richtlinie verstößt (ich gehe nicht auf die Frage ein und antworte auf die Kommentare anderer Benutzer), aber ich denke, es sollte Raum für Debatten zu den Themen geben, die noch in Arbeit sind (Vergessen wir nicht, dass sich Textblöcke im Modus "Zweite Vorschau" befinden. )

Chris T.
quelle
0

paragraph.replaceAll("\\n","") sollte den Job für Sie erledigen.

Guillaume
quelle
Intellij befindet sich jetzt in einer Art Absturzschleife, da ich die Escape-Zeichen am Ende der Zeile verwende. Vielleicht ist das Beste, dass ich es """ line line line """.replaceAll("\\n",""); momentan nicht verifizieren kann.
Alife
Ich nehme an, es gibt auch das (kleinere) Problem, dass dies zur Laufzeit und nicht zur Kompilierungszeit behandelt wird, aber das ist für meine Zwecke keine Voraussetzung.
Alife
Diese Lösung kann auch die \sFähigkeit von JDK-14 nicht ganz erreichen . Was ist, wenn ich mehrere Absätze ohne Zeilenumbrüche möchte, aber dazwischen Zeilenumbrüche.
Alife