Java 13 个三引号文本块 *WITHOUT* 换行符

Java 13 Triple-quote Text Block *WITHOUT* newlines

带有 """ 定界符的 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

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

有没有办法为三引号功能建立“无换行”参数?

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

您可以使用自 Java-11 以来引入的 String.lines 作为:

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

值得一提的是,这是 JShell 执行两个不同代码块的屏幕截图:

此功能的设计者也意识到了这一要求(参见 'New escape sequences' in JEP368). So, with the latest early access build for 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

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

扩展列出的几个问题:

  • Holger 提到“'text blocks' 功能不是很有说服力”。我见过很多进行人工字符串连接的“丑陋”代码,所以我认为该功能确实解决了一个问题。另一方面,我必须同意 像这样的功能留下了很大的滥用空间 (如“让我们在 Java 代码中放置大量文本因为现在我们可以很好地做到这一点!” - 请参阅下一点)。
  • 最初的问题提到了“大段落”,这让我建议根本不要使用此功能,而是将该内容外部化到资源文件中。
  • 关于清晰度和某些方面“对 reader 来说并不明显,因此我们有一个具有非明显含义的语法”。这部分是正确的,需要一些阅读和实验,而目前可用的 material 还不是那么多。我发现了这个:Programmer's Guide To Text Blocks, which provides quite a lot of examples. I also authored some examples, the one on text blocks being here: TextBlocks.java.

(别忘了 text blocks are in 'second preview' mode)。

为什么不通过扫描仪将其拉出来:

   String strip(String multiline){
      var scanner = new java.util.Scanner(multiline);
      var text = scanner.next();
      while (scanner.hasNext()) text += " "+ scanner.next();
      return text;
   }