Java 13 Text Block * SIN * líneas nuevas


12

El recurso de bloque de texto de múltiples líneas Java 13 con """delimitadores se está volviendo muy conocido.

Sin embargo, tengo una necesidad recurrente donde necesito párrafos enteros sin las nuevas líneas incrustadas.

En otras palabras, el siguiente fragmento de código:

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

produce lo siguiente, como era de esperar:

aaaa bbbb cccc
dddd eeee ffff
gggg hhhh iiii

... que suele ser tremendamente útil. Sin embargo, en mi caso, para párrafos particularmente grandes lo necesito para producir esto:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

(.... y lidiar con el flujo de texto más adelante).

¿Hay alguna forma de establecer un parámetro "sin nueva línea" para la función de triple comilla?


Imagine que ingresa una gran cantidad de texto que luego formará parte de un documento HTML, o que fluirá de manera similar en (digamos) un cuadro de diálogo redimensionable. Quiero entrar en muchos vale la pena "líneas" de datos sin el "line" + "line" + "line", etc., y sin la RFL de aparecer. Evitar una sintaxis tan obtusa y difícil de mantener es completamente el punto detrás """.
Vivo el

Respuestas:


16

Los diseñadores de esta característica también se dieron cuenta de este requisito (ver 'Nuevas secuencias de escape' en JEP368). Entonces, con la última compilación de acceso temprano para JDK 14 , puede usar un seguimiento \para escapar de la nueva línea al final de una línea:

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

Huellas dactilares:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

14, ¿eh? Me pregunto cómo funcionará la concatenación de sangría, o si se limpia todo el espacio en blanco.
alife

Pero eso aún requeriría modificar la entrada de cadena existente que podría ser lo suficientemente valiosa como para eliminar directamente las nuevas líneas en ese caso.
Naman

3
Hmm, primero que dicen siendo capaces de texto literal incrustar tal cual es una característica tan importante que justifica los cambios de lenguaje, ahora se pone secuencias de escape por su cuenta, y tengo que maravilla, ¿cuál es la ventaja con respecto a poner "aaaa bbbb cccc ", +"dddd eeee ffff "y +"gggg hhhh iiii ", cada en una línea distinta ...
Holger

@Holger La función se ha dividido en 2; bloques de texto (también conocidos como cadenas de varias líneas) y literales de cadena sin formato (es decir, cadena as-is, que es tbd). Esto es solo lo primero. Tenga en cuenta que otros escapes, como \n, todavía funcionan en bloques de texto.
Jorn Vernee

1
Pero ahora que lo tenemos readString, los recursos integrados también son mucho más fáciles de manejar. Nunca quise integrar párrafos enteros en el código fuente, solo las cosas de E / S eran molestas.
Holger

4

Puede usar String.linesintroducido desde Java-11 como:

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

Un complemento y para lo que vale la pena, aquí hay una captura de pantalla de la ejecución de JShell de los dos bloques de código diferentes:

ingrese la descripción de la imagen aquí


3
... que hace lo mismo queString output = paragraph.replaceAll("[\n\r]", "");
Holger

Y ninguna de las soluciones (hasta la modificación de JDK-14 de permitir \sen el """bloque) me permite mezclar líneas sin EOL con líneas donde realmente quiero el retorno difícil (como entre párrafos, etc.)
vivo el

1

De hecho, encontrar una buena respuesta en Java 13 no es fácil (tal vez incluso imposible), pero creo que Jorn Vernee abordó la preocupación con gracia en su respuesta (las nuevas secuencias de escape en Java 14 proporcionan una solución aceptable).

Para ampliar sobre varias preocupaciones enumeradas:

  • Holger menciona que "la característica de 'bloques de texto' no es muy convincente". He visto un montón de código "feo" que realiza la concatenación de cadenas artificiales, por lo que creo que la función definitivamente resuelve un problema . Por otro lado, tengo que aceptar que una característica como esta deja mucho espacio para el abuso (como en "¡pongamos mucho texto en el código Java porque ahora podemos hacerlo muy bien!" - vea el siguiente punto )
  • La pregunta original menciona "párrafos grandes" que me aconsejan no usar esta función en absoluto, sino externalizar ese contenido a archivos de recursos.
  • Sobre la claridad y que ciertos aspectos "no son obvios para el lector, entonces tenemos una sintaxis con un significado no obvio". Eso es en parte correcto, y requiere algo de lectura y experimentación, mientras que el material disponible no es tan amplio en este momento. Encontré esto: Guía del programador para bloques de texto , que proporciona muchos ejemplos. También escribí algunos ejemplos, el de los bloques de texto que está aquí: TextBlocks.java , espero que sean de ayuda.

Nota para el moderador: Sé que esta respuesta potencialmente viola la directriz (no abordo la pregunta y respondo a los comentarios de otros usuarios), pero creo que debería haber espacio para el debate sobre los temas que aún están en progreso (no olvidemos que los bloques de texto están en modo 'segunda vista previa' ).


0

paragraph.replaceAll("\\n","") debería hacer el trabajo por ti.


Intellij ahora está en algún tipo de bloqueo debido a mi uso de los caracteres de escape al final de la línea. Quizás lo mejor sería """ line line line """.replaceAll("\\n",""); No puedo verificarlo ahora.
alife

Supongo que también existe el problema (menor) de que esto se maneja en tiempo de ejecución y no en tiempo de compilación, pero eso no es un requisito para mis propósitos.
alife

Esta solución tampoco puede alcanzar la \scapacidad de JDK-14. ¿Qué pasa si quiero varios párrafos sin saltos de línea, pero los saltos de línea entre ellos?
alife
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.