Java 13文本块*没有*换行符


12

具有"""定界符的Java 13多行文本块功能已广为人知。

但是,我经常需要没有嵌入式换行符的整个段落。

换句话说,以下代码段:

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

如您所料,将产生以下内容:

aaaa bbbb cccc
dddd eeee ffff
gggg hhhh iiii

...这通常非常有用。但是,就我而言,对于特别大的段落,我需要它来产生此内容:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

(...并稍后处理文本流。)

有没有办法为三引号功能建立“ no-newline”参数?


想象一下输入大量文本,这些文本将成为HTML文档的一部分,或者类似地流入(例如)可调整大小的对话框中。我想在数据的许多“行”值得进入,而不"line" + "line" + "line"等,并没有EOL的显示出来。避免这种晦涩难懂且难以维护的语法完全是其背后的重点"""
alife

Answers:


16

此功能的设计人员也意识到了这一要求(请参阅JEP368中的“新转义序列”)。因此,使用最新的JDK 14早期访问版本,您可以\在行尾使用尾随来换行:

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

印刷品:

aaaa bbbb cccc dddd eeee ffff gggg hhhh iiii

14,是吗?我想知道缩进的级联将如何工作,还是将所有空白都清除干净?
alife

但这仍然需要修改现有的字符串输入,这可能足以在这种情况下直接删除换行符。
纳曼

3
嗯,首先,他们说能按原样嵌入文字文本是这样的,它证明语言的变化的一个重要特征,现在它获得自己的转义序列,和我想知道,有什么优势推杆"aaaa bbbb cccc "+"dddd eeee ffff "以及+"gggg hhhh iiii "各在不同的地方…
Holger

@Holger功能已拆分为2;文本块(又称多行字符串)和原始字符串文字(即,按原样的字符串,即tbd)。这只是前者。请注意,其他转义\n字符(如)仍可在文本块中使用。
Jorn Vernee

1
但现在有了readString,嵌入式资源也更容易处理。我从来不想将整个段落都集成到源代码中,只有I / O令人讨厌。
Holger

4

您可以String.lines将Java-11以来的Introduction用作:

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

这是免费的,值得这样做,这是来自两个不同代码块的JShell执行的屏幕截图:

在此处输入图片说明


3
…与String output = paragraph.replaceAll("[\n\r]", "");
Holger

而且没有一种解决方案(直到JDK-14修改为允许\s进入该"""块),才使我可以将无EOL的行与我确实希望硬返回的行(例如段落之间等)混合在一起
alife

1

确实,要在Java 13中找到一个好的答案并不容易(甚至可能是不可能的),但是我认为Jorn Vernee在答复中很好地解决了这个问题(Java 14中的新转义序列提供了可接受的解决方案)。

要扩展列出的几个关注点:

  • 霍尔格提到““文本块”功能不是很令人信服”。我已经看到很多执行人工字符串连接的“丑陋”代码,因此我认为该功能肯定可以解决问题。另一方面,我必须同意,这样的功能会留有很大的滥用空间(例如“让我们在Java代码中放很多文本,因为现在我们可以很好地做到了!”)-参见下一点)。
  • 最初的问题提到“大段”,这使我建议完全不使用此功能,而是将内容外部化为资源文件。
  • 关于清楚性和某些方面“对于读者来说并不明显,因此我们的语法含义不明显”。这在某种程度上是正确的,并且需要一些阅读和实验,而此时可用的材料还不是那么广泛。我发现了这一点:文本块程序员指南,其中提供了很多示例。我还编写了一些示例,其中一个关于文本块的示例位于:TextBlocks.java-希望它们会有所帮助。

主持人的注意事项:我知道此答案可能违反准则(我没有解决问题,而是回复了其他用户的评论),但我认为对于仍在进行中的主题应该有辩论的余地(请不要忘记,文本块处于“第二预览”模式)。


0

paragraph.replaceAll("\\n","") 应该为您完成工作。


由于我在行尾使用转义字符,因此Intellij现在处于某种崩溃循环中。也许最好的办法是""" line line line """.replaceAll("\\n",""); 现在无法验证。
alife

我想还有一个(次要的)问题,它是在运行时而不是在编译时处理的,但这并不是我所需要的。
alife

该解决方案也无法完全达到\sJDK-14 的能力。如果我想要几个没有换行符的段落,但它们之间有换行符怎么办。
alife
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.