原始字符串文字没有进入Java 12。Java 13中提供了类似的功能,而不是预览功能 - 文本块。有关详细信息,请参阅下面的帖子。

Java 13文本块

在从Java 12中删除类似功能之后,Java 13最终支持多行字符串文字。

Raw String 在 Java 12 的最终版本发布之前被删除,现在被认为已经过时了。

我们当然感到失望的是,这意味着这个功能需要稍长时间才能成为语言,但我们认为这是最好的选择。

虽然我们可以预期,对于任何语言功能,都会有一个非常重要的“我会更喜欢它不同”的反馈,在回顾我们收到的反馈时,我不再相信我们已经达到了正确的设置在复杂性和表现力之间进行权衡,或者我们已经探索了足够的设计空间,以确信当前的设计是我们能做的最好的。通过撤销,我们可以继续改进设计,探索更多选项,并瞄准实际满足预览功能流程(JEP 12)要求的预览。

字符串文字

目前(Java之前的版本12),Java中的字符串文字在许多情况下不必要地难以处理并且具有一些限制。

首先,Java不支持多行字符串。如果希望字符串跨越多行,则必须连接多个字符串:

String myString = "This is my string" +" which I want to be " +"on multiple lines.";

但它变得更糟。如果希望字符串实际包含新行,则需要\n在每行后插入。

String myString = "This is my string\n" +" which I want to be \n" +"on multiple lines.";

使用反斜杠转义特殊字符(如换行符)\。这对于双引号是必要的,"因为它们将终止字符串以及反斜杠\字符,因为它将指示转义字符。除此之外,java中有一大堆转义序列:

序列 用法
\ t 标签
\ b 退格(删除上一个字符)
\ n 新队
\ r 回程
\F 表格饲料
单引号字符
\” 双引号字符
\ 反斜杠字符

字符串文字通常难以阅读,因为它们受到转义序列的困扰:

String myPath = "Open \"C:\\Program Files\\Java\\jdk1.8.0_151\"";

对于正则表达式来说尤其糟糕,正则表达式可能会使用大量的反斜杠,因此很难读取。

原始字符串

事实证明,其他JVM语言已经解决了多行字符串和转义序列的可读性问题。它们被称为Raw Strings。它们可以跨越多行而不连接,并且它们不使用转义序列。您可以直接使用反斜杠或双引号。例如,在Kotlin中,除了常规字符串文字之外,您还可以使用带有三个双引号的Raw Strings """而不是一个。

val text = """
This is my string
which I want to be
on multiple lines.
It can contain backslash \
Or even double-quotes "
"""

在JVM上,Groovy和Scala也支持使用原始字符串"""。Java就像通常迟到一样(类似于引入JShell REPL),现在只在版本12中介绍了其他JVM和非JVM语言中已经很常见的内容。

Java中的原始字符串文字

在Java 12中,新功能之一将是JEP 326:Raw String Literals。与使用"""Java的Kotlin,Groovy或Python 决定使用反引号```表示法不同,后者当前由Javascript或Go使用。

String rawString = `This is my string
which I want to be
on multiple lines.
It can contain backslash \
Or even quotes "`;

但与javascript不同,字符串内的反引号不需要转义。相反,您可以使用多个反引号来启动字符串,然后使用相同数量的反引号来结束它:

`This uses single backtick`
``This can contain backtick `, see?``
```Can use any number of backticks```

无论您使用多少反引号或者使用原始或原始字符串文字,结果.class文件都是相同的,并且两个文字都会生成java.lang.String

格式化

多行原始字符串的一个问题是它们将每行上的所有字符解释为字符串的一部分。想象一下下面的代码。

public class Main {public static void main(String[] args) {String myString =`This is my stringwhich I want to beon multiple lines.`;System.out.println(myString);}
}

原始字符串的每一行在左边都包含一些空格作为缩进,因此代码格式很好 - 4个空格缩进,因为它在一个类中,另外4个因为它在main方法中。如果你运行它,你会看到:

This is my stringwhich I want to beon multiple lines.

该字符串包含缩进,只能将代码格式化为更易读,但它不是字符串的一部分。

快速解决方法是删除缩进,但很难理解:

public class Main {public static void main(String[] args) {String myString =`This is my string
which I want to be
on multiple lines.`;System.out.println(myString);}
}

实际上,String该类中有几种新方法,可用于处理缩进。

该方法align()修剪字符串的水平和垂直缩进,并保持线的相对缩进。

public class Main {public static void main(String[] args) {String myString = `This is my stringwhich I want to beon multiple lines.Note that after alignment,only relative indentation is preserved.`.align();System.out.println(myString);}
}

对齐后,输出将为:

This is my string
which I want to be
on multiple lines.Note that after alignment,only relative indentation is preserved.

如果您不想修剪空白但只增加或减少对齐,则可以使用 String.indent(numberOfSpaces)

// Increase existing indentation of each line by 2
myString.indent(2);
// Decrease existing indentation of each line by 2
myString.indent(-2);

作为简写,如果align()使用整数参数而不是零参数调用,它将首先对齐,然后按给定的数字缩进:

// Align and then increase existing indentation of each line by 2
myString.align(2);

字符串插值

目前支持Raw String文字的其他语言通常也支持字符串插值。它基本上是一个花哨的名称,用字符串替换字符串中的变量占位符,例如:

    val name = "John"println("Hi, my name is ${name}.")

不幸的是,这在Java中仍然是不可能的,甚至不是Java 12. JEP 326甚至明确指出这不是本提案的一部分。但是,将来某些其他提案可能会引入它。

IntelliJ IDEA支持

好消息是,自2018.3版以来,IDEA已经支持Raw String Literals。

您可以将旧的字符串文字转换为原始字符串,反之亦然。IDEA将为您处理转义序列转换和拆分为多行。

IDEA还可以检测您是否不必要地使用过多的反引号,并且能够为您移除多余的反引号。

除此之外,它现在还支持Raw String Literals中的拼写检查或正则表达式检测等操作。您可以在IntelliJ IDEA 2018.3中的预览原始字符串文字中内容。

亲自尝试一下

截至11/2018 Java 12尚未推出,但您已经可以下载JDK 12的早期版本,并为自己尝试Raw Strings。

Java 12 生字符串字面量相关推荐

  1. c语言相邻字符串字面量,C语言预处理#运算符的细节

    #运算符将宏的一个参数转换为字符串字面量,它仅允许出现在带参数的宏的替换列表中. 例如:使用PRINT_INT宏作为一个快捷的方法来整形变量或者表达式的值,#运算符可以使PRINT_INT为每个输出的 ...

  2. c 将数字数组转成字符串_C+|用指针指向字符串字面量、字符数组及字符指针数组...

    指针可以指向一个字符串字面量,可以指向一个字符数组,可以指向一块动态分配的内存单元: char *s1, *s2, *s3 = "abcde"; char ch[] = " ...

  3. 【C++grammar】vector类和字符串字面量

    C++的vector类 用数组存放数据时,容量大小不可变,vector对象容量可自动增大. vector的操作: 调用push_back函数时,vector对象的容量可能会增大. 观察下列操作对vec ...

  4. python字符串字面量有哪四种定义方式_Python进阶16_字符串基础操作

    前面介绍了一下比较晦涩而且深入的字符文本的处理方法,接下来几节将带来一些常规的操作.比较容易入手. 字符串处理 字符串字面量 字符字面量的通过使用:以单引号开始和结束,但是如何处理的是字符串内使用单引 ...

  5. 单引号和双引号的区别(字符串字面量 字符常量) | C语言

    在 C 语言中,单引号与双引号是有很大区别的. 字符串字面量:使用一对双引号括起来的字符序列. 在 C 语言中没有专门的字符串类型,因此双引号内的字符串会被存储到一个数组中,这个字符串代表指向这个数组 ...

  6. 深度讲解TS:这样学TS,迟早进大厂【15】:字符串字面量类型

    博主是一个专注于前端开发的程序猿~ 曾经主做于vue,react,小程序,uniapp,RN等各大框架~ 现在主攻web安全,数据加密,项目架构,性能优化~ 技术之路,任道重远.未来属于努力奋斗的我们 ...

  7. python字符串字面量有哪四种定义方式_Python学习笔记(四)字符串型

    字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 在最新的Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言 ...

  8. python字符串字面量有哪四种定义方式_python中字符串连接的四种方式

    原博文 2018-12-05 14:28 − 以下实例展示了join()的使用方法 #!/usr/bin/python str = "-"; seq = ("a" ...

  9. c语言里字符串和字符串字面量,string literals(字符串字面量)

    构造一个指定字符数组类型的未命名对象,用于需要在源代码中嵌入字符串时使用. 句法 " s-char-sequence "(1)u8 " s-char-sequence & ...

  10. rust多行字符串字面量

    let string = "line oneline two"; 相当于line one\n line two,注意第二行的前导空格还在. let string = "o ...

最新文章

  1. 05: zabbix 监控配置
  2. 基于 ASK + EB 构建容器事件驱动服务
  3. reactjs基础:jsx小练习
  4. 机器学习一定要很优秀才能做嘛?其实我们都可以。
  5. 1005. 继续(3n+1)猜想 (25)
  6. Squid-4.1(最新)安装及构建代理服务器
  7. TypeScript里的工具类型Partial的用法
  8. php删除菜单栏,如何删除WordPress站点健康状态面板和菜单项
  9. SPSS基础操作(二):用迭代法处理序列相关,并建立回归方程
  10. 海南计算机考研和培训哪个比较好,海南考研集训营前十排名
  11. 刷题笔记(2) 将数组中的数字组合成一个最小的数
  12. Linux工具篇 | Linux下安装repo工具
  13. 信息学奥赛 java C 选_信息学奥赛(NOIP)入门指南(新家长必读)
  14. 腾讯电脑管家怎么阻止软件自动安装
  15. am3352 项目记录
  16. 百度网盘加速教程(绝对有效)
  17. HTML5简单实战--休假申请单
  18. OpenHarmony更新编译问题及解决办法
  19. 用剥洋葱理解递归逆序输出单链表
  20. 【STL编程】【竞赛常用】【part 2】

热门文章

  1. 超算简史:练飞天之技,登峰一战后,终有落地日 | 凌云时刻
  2. 【集群仿真】基于matlab匈牙利算法无人机队形重构集群仿真【含Matlab源码 1498期】
  3. 【笔检测】基于matlab模板匹配+PCA笔检测【含Matlab源码 1093期】
  4. 【MCVRP】基于matlab模拟退火算法求解带多种容量的车辆路径规划问题【含Matlab源码 918期】
  5. 证明神经网络的通用逼近定理_在您理解通用逼近定理之前,您不会理解神经网络。...
  6. [并发]线程池关闭的问题
  7. 从0开始写一个基于Flutter的开源中国客户端(7)——App网络请求和数据存储
  8. 如何监控微信小程序HTTP请求错误
  9. 集结六大行业领袖,「数据科学家」新课全球首发!
  10. HID Global推出全新室内定位服务 助力企业优化配置劳动力