Java 13 Text Block * WITHOUT * newline


12

La funzione di blocco di testo multilinea Java 13 con """delimitatori sta diventando ben nota.

Tuttavia ho un'esigenza ricorrente in cui ho bisogno di interi paragrafi senza le nuove righe incorporate.

In altre parole, il seguente frammento di codice:

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

produce quanto segue, come previsto:

aaaa bbbb cccc
dddd eeee ffff
gggg hhhh iiii

... che di solito è tremendamente utile. Tuttavia, nel mio caso, per paragrafi particolarmente grandi ne ho bisogno per produrre questo:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

(.... e gestire il flusso di testo in un secondo momento.)

C'è un modo per stabilire un parametro "no-newline" per la funzione a virgoletta tripla?


Immagina di inserire una grande quantità di testo che deve essere successivamente parte di un documento HTML o che scorre in modo simile in (diciamo) una finestra di dialogo ridimensionabile. Voglio entrare in molti "linee" vale la pena di dati senza la "line" + "line" + "line", ecc, e senza l'EOL del rivelando. Evitare una sintassi così ottusa e difficile da mantenere è interamente il punto dietro """.
alife,

Risposte:


16

Anche i progettisti di questa funzionalità hanno realizzato questo requisito (vedere "Nuove sequenze di escape" in JEP368). Quindi, con l'ultimo build di accesso anticipato per JDK 14 puoi usare un trailing \per sfuggire alla nuova linea alla fine di una riga:

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

stampe:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

14, eh? Mi chiedo come funzionerà la concatenazione del rientro o se tutto lo spazio bianco viene pulito?
alife,

Ma ciò richiederebbe comunque la modifica dell'input di stringa esistente che potrebbe essere abbastanza degno di rimuovere direttamente le nuove righe in quel caso.
Naman,

3
Hmm, prima che dicono essere in grado di testo letterale incorporare così com'è è una caratteristica così importante da giustificare linguaggio cambia, ora si arriva sequenze di escape per conto loro, e mi chiedo, qual è il vantaggio rispetto la messa "aaaa bbbb cccc ", +"dddd eeee ffff "e +"gggg hhhh iiii ", ogni in una linea distinta ...
Holger il

@Holger La funzione è stata divisa in 2; blocchi di testo (ovvero stringhe multilinea) e valori letterali di stringa non elaborati (ovvero stringa così com'è, che è tbd). Questo è solo il primo. Si noti che altre escape, come \n, funzionano ancora nei blocchi di testo.
Jorn Vernee,

1
Ma ora che abbiamo readString, anche le risorse integrate sono molto più facili da gestire. Non ho mai voluto integrare interi paragrafi nel codice sorgente, solo le cose di I / O erano fastidiose.
Holger,

4

È possibile utilizzare String.linesintrodotto da Java-11 come:

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

Un omaggio e per quello che ne vale la pena, ecco uno screenshot dall'esecuzione di JShell dei due diversi blocchi di codice:

inserisci qui la descrizione dell'immagine


3
... che fa lo stesso diString output = paragraph.replaceAll("[\n\r]", "");
Holger il

E nessuna delle soluzioni (fino alla modifica di JDK-14 di consentire \snel """blocco) mi consente di mescolare linee senza EOL con linee in cui in realtà voglio il ritorno rigido (come tra paragrafi, ecc.)
alife

1

In effetti, trovare una buona risposta in Java 13 non è facile (forse addirittura impossibile) ma penso che Jorn Vernee abbia affrontato la preoccupazione con garbo nella sua risposta (le nuove sequenze di escape in Java 14 forniscono una soluzione accettabile).

Per espandere su diverse preoccupazioni elencate:

  • Holger menziona "la funzione dei 'blocchi di testo' non è molto convincente". Ho visto un sacco di codice "brutto" che concatena le stringhe artificiali, quindi penso che la funzione risolva definitivamente un problema . D'altra parte, devo essere d'accordo sul fatto che una caratteristica come questa lascia molto spazio agli abusi (come in "mettiamo un sacco di testo nel codice Java perché ora possiamo farlo bene!" - vedere il punto successivo ).
  • La domanda originale menziona "paragrafi di grandi dimensioni" che mi suggeriscono di non utilizzare affatto questa funzione, ma di esternare quel contenuto a file di risorse.
  • A proposito della chiarezza e che alcuni aspetti "non sono ovvi per il lettore, quindi abbiamo una sintassi con un significato non ovvio". Ciò è in parte corretto e ci vuole un po 'di lettura e sperimentazione mentre il materiale disponibile non è così vasto in questo momento. Ho trovato questo: Guida del programmatore ai blocchi di testo , che fornisce molti esempi. Ho anche creato alcuni esempi, quello su blocchi di testo qui: TextBlocks.java - speriamo che possano essere d'aiuto.

Nota per il moderatore: so che questa risposta viola potenzialmente le linee guida (non rispondo alla domanda e rispondo ai commenti di altri utenti), ma penso che ci dovrebbe essere spazio per il dibattito per gli argomenti che sono ancora in corso di elaborazione (non dimentichiamo che i blocchi di testo sono in modalità 'seconda anteprima' ).


0

paragraph.replaceAll("\\n","") dovrebbe fare il lavoro per te.


Intellij è ora in una sorta di crash loop a causa del mio uso dei personaggi di escape alla fine della linea. Forse ciò che sarebbe meglio è """ line line line """.replaceAll("\\n",""); Impossibile verificarlo adesso.
alife,

Suppongo che ci sia anche il problema (minore) che questo viene gestito in fase di esecuzione e non in fase di compilazione, ma non è un requisito per i miei scopi.
alife,

Anche questa soluzione non riesce a raggiungere l' \sabilità di JDK-14. E se volessi diversi paragrafi senza interruzioni di riga, ma interruzioni di riga tra di loro.
alife,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.