Bloc de texte Java 13 * SANS * sauts de ligne


12

La fonctionnalité de bloc de texte multi-lignes Java 13 avec """délimiteurs devient de plus en plus connue.

Cependant, j'ai un besoin récurrent où j'ai besoin de paragraphes entiers sans les nouvelles lignes intégrées.

En d'autres termes, l'extrait de code suivant:

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

produit ce qui suit, comme vous vous en doutez:

aaaa bbbb cccc
dddd eeee ffff
gggg hhhh iiii

... ce qui est généralement extrêmement utile. Cependant, dans mon cas, pour les paragraphes particulièrement volumineux, j'en ai besoin pour produire ceci:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

(.... et traiter le flux de texte plus tard.)

Existe-t-il un moyen d'établir un paramètre "sans nouvelle ligne" pour la fonction de citation triple?


Imaginez que vous saisissiez une grande quantité de texte qui fera partie plus tard d'un document HTML ou qui se déroulerait de manière similaire (disons) dans une boîte de dialogue redimensionnable. Je veux entrer dans de nombreuses "lignes" de données sans le "line" + "line" + "line", etc., et sans que la fin de vie n'apparaisse. Éviter une syntaxe aussi obtuse et difficile à maintenir est entièrement le point derrière """.
alife

Réponses:


16

Les concepteurs de cette fonctionnalité ont également réalisé cette exigence (voir «Nouvelles séquences d'échappement» dans JEP368). Ainsi, avec la dernière version à accès anticipé pour JDK 14, vous pouvez utiliser une fin \pour échapper à la nouvelle ligne à la fin d'une ligne:

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

Tirages:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

14, hein? Je me demande comment la concaténation de l'indentation fonctionnera, ou si tout l'espace blanc est nettoyé?
alife

Mais cela nécessiterait toujours de modifier l'entrée de chaîne existante, ce qui pourrait être suffisamment utile pour supprimer directement les retours à la ligne dans ce cas.
Naman

3
Hmm, tout d' abord quel est l'avantage sur la mise disent - ils être en mesure de texte intégré littéral-est est une caractéristique importante qui justifie les changements linguistiques, maintenant il obtient des séquences d'échappement eux - mêmes, et je me demande, "aaaa bbbb cccc ", +"dddd eeee ffff "et +"gggg hhhh iiii ", chaque dans une ligne distincte ...
Holger

@Holger La fonctionnalité a été divisée en 2; blocs de texte (alias chaînes multi-lignes) et littéraux de chaîne bruts (c'est-à-dire chaîne telle quelle, qui est tbd). Ce n'est que le premier. Notez que d'autres échappements, comme \n, fonctionnent toujours dans des blocs de texte.
Jorn Vernee

1
Mais maintenant que nous en avons readString, les ressources intégrées sont également beaucoup plus faciles à gérer. Je n'ai jamais voulu intégrer des paragraphes entiers dans le code source, seuls les éléments d'E / S étaient ennuyeux.
Holger

4

Vous pouvez utiliser String.linesintroduit depuis Java-11 comme:

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

À titre gratuit et pour ce qui en vaut la peine, voici une capture d'écran de l'exécution par JShell des deux blocs de code différents:

entrez la description de l'image ici


3
… Qui fait la même chose queString output = paragraph.replaceAll("[\n\r]", "");
Holger

Et aucune des solutions (jusqu'à la modification par JDK-14 de l'autorisation \sdans le """bloc) ne me permet de mélanger des lignes sans fin de ligne avec des lignes où je veux vraiment le retour dur (comme entre les paragraphes, etc.)
Alife

1

En effet, trouver une bonne réponse en Java 13 n'est pas facile (peut-être même impossible) mais je pense que Jorn Vernee a répondu avec élégance au problème dans sa réponse (les nouvelles séquences d'échappement en Java 14 fournissent une solution acceptable).

Pour développer plusieurs préoccupations énumérées:

  • Holger mentionne que "la fonction" blocs de texte "n'est pas très convaincante". J'ai vu beaucoup de code "laid" qui fait la concaténation artificielle de chaînes, donc je pense que la fonctionnalité résout définitivement un problème . D'un autre côté, je dois convenir qu'une fonctionnalité comme celle-ci laisse beaucoup de place aux abus (comme dans «mettons beaucoup de texte dans le code Java parce que maintenant nous pouvons le faire bien!» - voir le point suivant ).
  • La question d'origine mentionne des "gros paragraphes" qui me conseillent de ne pas utiliser cette fonctionnalité du tout, mais d'externaliser ce contenu vers des fichiers de ressources.
  • À propos de la clarté et du fait que certains aspects "ne sont pas évidents pour le lecteur, nous avons donc une syntaxe avec un sens non évident". C'est en partie correct, et cela prend un peu de lecture et d'expérimentation alors que le matériel disponible n'est pas si vaste en ce moment. J'ai trouvé ceci: Guide du programmeur pour les blocs de texte , qui fournit beaucoup d'exemples. J'ai également écrit quelques exemples, celui sur les blocs de texte étant ici: TextBlocks.java - j'espère que cela vous aidera.

Note pour le modérateur: Je sais que cette réponse viole potentiellement la directive (je ne réponds pas à la question et je réponds aux commentaires des autres utilisateurs), mais je pense qu'il devrait y avoir de la place pour un débat sur les sujets qui sont toujours en cours (n'oublions pas que les blocs de texte sont en mode «second aperçu» ).


0

paragraph.replaceAll("\\n","") devrait faire le travail pour vous.


Intellij est maintenant dans une sorte de boucle en panne à cause de mon utilisation des caractères d'échappement à la fin de la ligne. Peut-être que le mieux serait de """ line line line """.replaceAll("\\n",""); ne pas pouvoir le vérifier maintenant.
alife

Je suppose qu'il y a aussi le problème (mineur) que cela est géré au moment de l'exécution et non à la compilation, mais ce n'est pas une exigence pour mes besoins.
alife

Cette solution ne peut pas non plus atteindre la \scapacité de JDK-14. Et si je veux plusieurs paragraphes sans sauts de ligne, mais des sauts de ligne entre eux.
alife
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.