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.
为什么不通过扫描仪将其拉出来:
String strip(String multiline){
var scanner = new java.util.Scanner(multiline);
var text = scanner.next();
while (scanner.hasNext()) text += " "+ scanner.next();
return text;
}
带有 """
定界符的 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.
为什么不通过扫描仪将其拉出来:
String strip(String multiline){
var scanner = new java.util.Scanner(multiline);
var text = scanner.next();
while (scanner.hasNext()) text += " "+ scanner.next();
return text;
}