Bloco de texto Java 13 * SEM * novas linhas

12

O recurso de bloco de texto de várias linhas Java 13 com """delimitadores está se tornando bem conhecido.

No entanto, tenho uma necessidade recorrente em que preciso de parágrafos inteiros sem as novas linhas incorporadas.

Em outras palavras, o seguinte snippet de código:

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

produz o seguinte, como seria de esperar:

aaaa bbbb cccc
dddd eeee ffff
gggg hhhh iiii

... o que geralmente é tremendamente útil. No entanto, no meu caso, para parágrafos particularmente grandes, preciso que ele produza isso:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

(.... e lide com o fluxo de texto posteriormente.)

Existe uma maneira de estabelecer um parâmetro "sem nova linha" para o recurso de cotação tripla?

uma vida
fonte
Imagine inserir uma grande quantidade de texto que será posteriormente parte de um documento HTML ou fluirá de maneira semelhante em (digamos) uma caixa de diálogo redimensionável. Quero inserir muitas "linhas" no valor de dados sem o "line" + "line" + "line", etc., e sem a exibição da EOL. Evitar essa sintaxe obtusa e difícil de manter é inteiramente o ponto por trás """.
Alife

Respostas:

16

Os projetistas desse recurso também cumpriram esse requisito (consulte 'Novas sequências de escape' no JEP368). Portanto, com a última compilação de acesso antecipado para o JDK 14, você pode usar um trailing \para escapar da nova linha no final de uma linha:

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

Impressões:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii
Jorn Vernee
fonte
14, hein? Eu me pergunto como a concatenação do recuo funcionará, ou se todo o espaço em branco é limpo?
alife
Mas isso ainda exigiria a modificação da entrada de string existente, que pode ser suficiente para remover diretamente as novas linhas nesse caso.
Naman
3
Hmm, primeiro eles dizem ser capaz de texto literal incorporar como está é uma característica tão importante que justifica as alterações de linguagem, agora ele fica sequências de escape por conta própria, e eu tenho que saber, qual é a vantagem sobre colocar "aaaa bbbb cccc ", +"dddd eeee ffff "e +"gggg hhhh iiii ", cada em uma linha distinta ...
Holger
@Holger O recurso foi dividido em 2; blocos de texto (também conhecidos como strings de várias linhas) e literais de strings brutos (ou seja, como é a string, que é tbd). Este é apenas o primeiro. Observe que outras fugas, como \n, ainda funcionam em blocos de texto.
Jorn Vernee
11
Mas agora que temos readString, os recursos incorporados também são muito mais fáceis de lidar. Eu nunca quis integrar parágrafos inteiros no código fonte, apenas o material de E / S era irritante.
Holger
4

Você pode usar o String.linesintroduzido desde o Java-11 como:

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

Uma cortesia e pelo que vale a pena, aqui está uma captura de tela da execução do JShell dos dois blocos de código diferentes:

insira a descrição da imagem aqui

Naman
fonte
3
... o que faz o mesmo queString output = paragraph.replaceAll("[\n\r]", "");
Holger
E nenhuma das soluções (até a modificação do JDK-14 de permissão \sno """bloco) me permite misturar linhas sem EOL com linhas nas quais eu realmente quero o retorno rígido (como entre parágrafos, etc.)
alife
1

De fato, encontrar uma boa resposta no Java 13 não é fácil (talvez até impossível), mas acho que Jorn Vernee abordou a questão de maneira graciosa em sua resposta (novas seqüências de escape no Java 14 fornecem uma solução aceitável).

Para expandir várias preocupações listadas:

  • Holger menciona "o recurso 'blocos de texto' não é muito convincente". Eu já vi muitos códigos "feios" que fazem concatenação de cadeias artificiais, então acho que o recurso definitivamente resolve um problema . Por outro lado, eu tenho que concordar que um recurso como esse deixa muito espaço para abuso (como em "vamos colocar muito texto no código Java porque agora podemos fazê-lo de maneira agradável!" - veja o próximo ponto )
  • A pergunta original menciona "parágrafos grandes" que me aconselham a não usar esse recurso, mas a externalizar esse conteúdo para arquivos de recursos.
  • Sobre a clareza e que certos aspectos "não são óbvios para o leitor, temos uma sintaxe com um significado não óbvio". Isso está parcialmente correto, e é preciso alguma leitura e experimentação, enquanto o material disponível não é tão vasto neste momento. Encontrei o seguinte: Guia do Programador para blocos de texto , que fornece muitos exemplos. Eu também escrevi alguns exemplos, o dos blocos de texto aqui: TextBlocks.java - espero que eles ajudem.

Nota para o moderador: Eu sei que esta resposta viola potencialmente as diretrizes (não abordo a pergunta e respondo aos comentários de outros usuários), mas acho que deve haver espaço para debate sobre os tópicos que ainda estão em andamento. (não vamos esquecer que os blocos de texto estão no modo 'segunda visualização' ).

Chris T
fonte
0

paragraph.replaceAll("\\n","") deve fazer o trabalho para você.

Guillaume
fonte
Intellij agora está em algum tipo de loop travado por causa do meu uso dos caracteres de escape no final da linha. Talvez o melhor seria """ line line line """.replaceAll("\\n",""); não conseguir verificar agora.
alife
Suponho que também haja a questão (menor) de que isso é tratado em tempo de execução e não em tempo de compilação, mas isso não é um requisito para meus propósitos.
alife
Essa solução também não consegue alcançar a \scapacidade do JDK-14. E se eu quiser vários parágrafos sem quebras de linha, mas quebras de linha entre eles.
Alife