Java 12 生字符串字面量
原始字符串文字没有进入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 生字符串字面量相关推荐
- c语言相邻字符串字面量,C语言预处理#运算符的细节
#运算符将宏的一个参数转换为字符串字面量,它仅允许出现在带参数的宏的替换列表中. 例如:使用PRINT_INT宏作为一个快捷的方法来整形变量或者表达式的值,#运算符可以使PRINT_INT为每个输出的 ...
- c 将数字数组转成字符串_C+|用指针指向字符串字面量、字符数组及字符指针数组...
指针可以指向一个字符串字面量,可以指向一个字符数组,可以指向一块动态分配的内存单元: char *s1, *s2, *s3 = "abcde"; char ch[] = " ...
- 【C++grammar】vector类和字符串字面量
C++的vector类 用数组存放数据时,容量大小不可变,vector对象容量可自动增大. vector的操作: 调用push_back函数时,vector对象的容量可能会增大. 观察下列操作对vec ...
- python字符串字面量有哪四种定义方式_Python进阶16_字符串基础操作
前面介绍了一下比较晦涩而且深入的字符文本的处理方法,接下来几节将带来一些常规的操作.比较容易入手. 字符串处理 字符串字面量 字符字面量的通过使用:以单引号开始和结束,但是如何处理的是字符串内使用单引 ...
- 单引号和双引号的区别(字符串字面量 字符常量) | C语言
在 C 语言中,单引号与双引号是有很大区别的. 字符串字面量:使用一对双引号括起来的字符序列. 在 C 语言中没有专门的字符串类型,因此双引号内的字符串会被存储到一个数组中,这个字符串代表指向这个数组 ...
- 深度讲解TS:这样学TS,迟早进大厂【15】:字符串字面量类型
博主是一个专注于前端开发的程序猿~ 曾经主做于vue,react,小程序,uniapp,RN等各大框架~ 现在主攻web安全,数据加密,项目架构,性能优化~ 技术之路,任道重远.未来属于努力奋斗的我们 ...
- python字符串字面量有哪四种定义方式_Python学习笔记(四)字符串型
字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 在最新的Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言 ...
- python字符串字面量有哪四种定义方式_python中字符串连接的四种方式
原博文 2018-12-05 14:28 − 以下实例展示了join()的使用方法 #!/usr/bin/python str = "-"; seq = ("a" ...
- c语言里字符串和字符串字面量,string literals(字符串字面量)
构造一个指定字符数组类型的未命名对象,用于需要在源代码中嵌入字符串时使用. 句法 " s-char-sequence "(1)u8 " s-char-sequence & ...
- rust多行字符串字面量
let string = "line oneline two"; 相当于line one\n line two,注意第二行的前导空格还在. let string = "o ...
最新文章
- JVM内存状况查看方法和分析工具
- 后台返回给前端数据拆分成三级菜单
- 最长回文子序列(算法导论15-2
- jdk1.8新特性(五)——Stream
- java发送html模板
- 拿到一台新的Windows电脑,我会做什么?
- Python——验证码识别 安装Pillow、tesseract-ocr与pytesseract模块的安装以及错误解决
- 理解JavaScript里this关键字
- Nginx之虚拟服务器配置
- 浅入深出Vue:注册
- html5hover鼠标悬停,不使用hover外部CSS样式实现hover鼠标悬停改变样式
- selinux为enforcing模式时,运行anonymous上传之后无法删除
- 深度学习(四):高级卷积神经网络
- 萤火虫算法_第二十二章 萤火虫算法(Firefly Algorithm,FA)补充和答疑
- 微信小程序 java后勤服务管理系统app
- 1978-2021中国统计年鉴、2003-2019(省、市面板数据)、1999-2019(县域面板数据)
- 独立显卡驱动安装不成功解决办法
- 大家怎么看阿里云的“云渲染”服务?
- 获取键盘按下的键位对应ask码
- == 和 equals 的区别
热门文章
- 【图像隐写】基于matlab GUI DCT数字水印嵌入与提取【含Matlab源码 943期】
- 【图像分割】基于matlab GUI多种阈值图像分割(带面板)【含Matlab源码 733期】
- SPSS 虚拟变量(图文+数据集)【SPSS 038期】
- 多屏互动电脑版_手机、电脑屏幕太小怎么办?这4招秒变大屏
- NLP对放射科医生的评价
- android mdpi对应哪一个屏幕,Android屏幕大小为ldpi,mdpi,hdpi,xhdpi显示? - 例如:ldpi为1024X768像素...
- 使用ajax请求cgi,Python CGI同步AJAX请求
- js src 变量_人人都能看懂的鸿蒙 “JS 小程序” 数据绑定原理
- python3 与python2 异常处理的区别与联系
- 11-实战模拟DRBD项目案例环境准备