五金反引号

五种琴弦

从Java 1.0开始,我们就有了字符串文字"like this" 。 我们还想要其他什么字符串? 其他编程语言为我们提供:

  • 表达式插值: s"I am ${age - 10} years old."
  • 插值格式: f"Price: $price%8.2f"
  • 具有在编译时检查的内部语法的字符串: r"[0-9]+([.,][0-9]*)?xml"<a href='http://java.sun.com'>The Java home page</a>"
  • 不转义反斜杠的原始字符串: raw"\.*"
  • 可以包含换行符的多行字符串:
    """
    +-----+
    | Cay |
    +-----+
    """

在这里,我使用的语法让人想起Scala进行演示。 其他语言则做出了不同的选择。 例如,JavaScript使用反引号进行插值。

我最喜欢Java中的哪些功能? 对我而言,这将是编译时语法检查。 现在,IDE可以对特定的字符串(例如,正则表达式)进行有根据的猜测,并在其格式错误时发出警告。 但是,如果是编译时错误,那就更好了。

当然,这是一个难题。 除了注释处理,没有其他机制可以在编译时添加可插入检查。 可以提供检查字符串内容的注释,实际上Checker Framework就是这样做的。 但是您注释变量,而不是字符串文字,因此不是同一回事。

如果有一种进行插值和格式化的标准方法,那也很好。 现在,我们有String.formatMessageFormat.format ,它们都是有用的但不兼容。

相反,Java 12为我们提供了原始/多行字符串。 那也很好

原始字符串

考虑例如使用正则表达式搜索句点。 正则表达式为\. 因为您必须在正则表达式中转义一个句号。 因此在Java中,它是Pattern.compile("\\.") 。 为了匹配反斜杠,它是Pattern.compile("\\\\") 。 这会变得很混乱。

实际上,它是如此令人困惑,以至于JEP 326的作者弄错了它,或者也许具有微妙的幽默感。 作者的示例是Pattern.compile("\\\"")以匹配" 。 当然,您不需要在正则表达式中进行转义,因此Pattern.compile("\"")可以正常工作,这证实了所有转义都是一团糟。

解决方法很简单。 将字符串括在反引号`...` 。 反引号内的所有内容都无需逃脱: Pattern.compile(`\.`)

但是,如果字符串包含反引号怎么办?

在Scala和Kotlin中,您使用"""分隔符,但这引出了问题。如果字符串包含"""怎么办?

这是Java设计师提出我以前从未见过的一个聪明的主意。 您可以使用任意数量的反引号来开始一个原始字符串,然后使用相同数量的反引号来结束它。 例如,如果您知道您的字符串中没有五个连续的反引号,请执行以下操作:

String s = `````. . .
. . .
. . .
. . .`````; // Five golden backticks :-)

字符串中的所有内容均照原样进行。 如果它是一些HTML或SQL或您在其他地方开发的任何内容,则将其粘贴。

实际上,“按原样”是一个例外。 即使源文件使用Windows风格的\r\n行尾,所有行尾都被标准化为\n

美中不足的苍蝇

Stephen Colebourne指出,两个反引号可能会与空字符串混淆。 如果你有类似的东西

s = ``;
t = ``;

那么就不会将st设置为空字符串,而是将s设置为字符串";\nt = "

那里有个很好的谜题。

原始字符串不能以反引号开头或结尾。 例如,假设您要将以下Markdown片段放入Java字符串中:

<

pre>“`
警报(“ Hello,World!”)

</pre>
You obviously can't add backticks at the start, so the best thing you can do is add a space or newline before the <code>```</code>. And the same holds for the end. Java requires that the ending delimiters exactly match the start. (In contrast, in Scala, you can write <code>"""Hello, "World""""</code>, and the compiler figures out that one of the terminal quotation marks belongs to the string.)So, you can write:
<pre>String markdown = `````

警报(“ Hello,World!”)

“”`.strip();

strip调用将在开头和结尾删除\n 。 或者,也可以将换行符留在原处,如果它们无关紧要。

strip方法是Java 11的新功能。它与trim相似,但是它去除了开头和结尾的Unicode空白,而trim删除了≤32的字符,这已经不一样了。这些天,您应该使用strip ,而不是trim 。)

IDE支持

激活JDK 12的实验功能时,IntelliJ 2018.3可以将带有反斜杠的字符串转换为原始字符串。(有关详细信息,请参阅此博客文章 。)
五弦
我尝试转换老式的多行字符串:

private static final String authorPublisherQuery = "SELECT Books.Price, Books.Title\n"+ " FROM Books, BooksAuthors, Authors, Publishers\n"+ " WHERE Authors.Author_Id = BooksAuthors.Author_Id AND BooksAuthors.ISBN = Books.ISBN\n"+ " AND Books.Publisher_Id = Publishers.Publisher_Id AND Authors.Name = ?\n"+ " AND Publishers.Name = ?\n";

那是行不通的,但是没有理由为什么将来不会。

压痕管理

我更喜欢在最左边的列上排列多行字符串。 例如,

public static void main(String[] args) {String myNameInABox = `
+-----+
| Cay |
+-----+`.strip(); System.out.print(myNameInABox);}

它使多行字符串从Java代码中脱颖而出。 它为您放入原始字符串中的所有内容提供了足够的水平空间。

但是,很多人似乎更喜欢将多行字符串的内容与Java代码对齐的样式:

...String myNameInABox = `+-----+| Cay |+-----+`.align();System.out.print(myNameInABox);

align方法(在Java 12中定义)删除空格的公共前缀以及空白行的开头和结尾。

这种方法存在风险。 如果混合使用制表符和空格,则每个制表符都计为一个空格。 在您的IDE中,有些东西看起来与您对齐,但与align方法不一致。 当然,您的IDE可能会警告您这种情况。 IntelliJ 2018.3当前不这样做。

未走的路

关于新功能的许多讨论都在“ Amber Spec”邮件列表中进行,您可以在http://mail.openjdk.java.net/pipermail/amber-spec-observers/上进行观察,因此您可以看到具有哪些替代品被考虑。

关于是否应该自动删除缩进进行了激烈的讨论。 可以预见,这最终没有被采纳。

原始字符串中的Unicode转义如何处理? \u0060应该是反引号吗? 理智盛行,决定“原始意味着原始”。

是否应该将两个反引号定为非法,因为``可能与空字符串混淆? 不可以,只有一个简单的规则,即“任何数量的反引号”。

在开始反引号之后换行怎么样? 关于是否应该将其剥离存在一些来回的意见。 我仍然感到遗憾的是,没有对此问题给予更多关注。 在换行符中添加换行符将解决两个问题:初始反引号和最左列的对齐。

我胆怯地问,为什么关闭分隔符不能“至少与打开分隔符一样多的反引号”(类似于Scala),以便原始字符串可以以反引号结尾。 不幸的是,我没有回应。

令人惊讶的是,像这样的概念上简单的功能有多少细节。 撇开小调,这是一个非常受欢迎的礼物,正好赶上假期。

翻译自: https://www.javacodegeeks.com/2018/12/five-golden-backticks.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多功能视频光端机_多业务光端机的功能特性

视频光端机&#xff0c;就是把1到多路的模拟视频信号通过各种编码转换成光信号通过光纤介质来传输的设备&#xff0c;由于视频信号转换成光信号的过程中会通过模拟转换和数字转换两种技术&#xff0c;所以视频光端机又分为模拟光端机和数字光端机。光端机原理就是把信号调制到光…

[渝粤教育] 中国地质大学 信息资源管理 复习题 (2)

《信息资源管理》模拟题 一.单选题 1.目前在我国各级政府部门在信息资源管理过程中的主要职责是(). A.向社会提供信息服务 B从政策上指导信息资源的开发和利用 C.直接从事信息资源的开发和管理 D.研究制定信息资源开发的标准和规范 2.研究与制定信息资源开发的标准与规范的责…

curl_exec() 执行的时候发送不出去_为什么端口明明开着,nmap却扫描不出来,看老司机怎么指点迷津...

大家应该都知道&#xff0c;nmap是用来扫描端口的标杆级神器&#xff0c;我们经常在运维工作或安全评估中使用到它。在使用的时候&#xff0c;我们可能会碰到明明目标IP端口有开着&#xff0c;但是nmap却死活扫描不出来&#xff0c;等了大半天却得到一些不可靠的结果。那到底是…

[渝粤教育] 中国地质大学 地球科学概论 复习题 (2)

《地球科学概论》模拟题 一.单选题 1.有一种岩石其SiO2含量为69%中粗粒粒状结晶结构片麻状构造主要由长石石英和角闪石等矿物组成这种岩石应该是() A.花岗岩; B.流纹岩; C.片麻岩; D.闪长岩 2.安山岩的化学成分相似于() A.橄榄岩 B.闪长岩 C.花岗岩 D.辉长岩 3.下列描述正确的…

4路视频+4路百电(物理隔离)+8路电话+开关量+串口+电话光端机 武警光端机

产品描述 本系列产品&#xff0c;是在该公司研制的专用超大规模集成电路的基础上&#xff0c;研发的点对点多业务光传输设备。此款产品提供4路视频&#xff0c;1-8路电话接口&#xff1b;1-16路开关量接口/1-8路RS232-422-485接口&#xff1b;4路百兆以太网接口&#xff0c;4路…

[渝粤教育] 中国地质大学 大学英语(6) 复习题

《大学英语(3)》模拟题 一.单选题 1.Are you sure about that?(). A.You needn’t worry about that. B.I like the idea. C.Ohno.I’m afraid of that. D.Ohyes.I’m absolutely positive. 2.Before I got to the cinemathe film(). A.had begun B.has begun C.is begun D.w…

yuki翻译器钩子_git hooks钩子

GIT HOOKS钩子(hooks)是一些在"$GIT-DIR/hooks"目录的脚本,在被特定的事件(certain points)触发后被调用。当"git init"命令被调用后,一些非常有用的示例钩子文件(hooks)被拷到新仓库的hooks目录中;但是在默认情况下这些钩子(hooks)是不生效的。 把这些钩子…

返回值是内置类型 不能更改_选择通过更改内容类型返回的详细程度,第二部分...

返回值是内置类型 不能更改在上一篇文章中 &#xff0c;我们研究了如何使用MOXy的功能来控制特定实体的数据输出级别。 这篇文章着眼于Jersey 2.x提供的抽象&#xff0c;它允许您定义一组自定义的批注以具有相同的效果。 与之前一样&#xff0c;我们几乎没有什么琐碎的资源可以…

[渝粤教育] 中国地质大学 嵌入式操作系统 复习题 (2)

《嵌入式操作系统》模拟题 一.单选题 1./babys目录属于project群组(group)并设置了1770的访问权限.而project群组的成员如下: #group dog cat foxdog: dog projectcat:cat project fox:fox project请问以上每一个用户具有对/babys目录中其他用户的文件和目录的有效访问权限是哪…

武警多业务光端机,五防光端机产品介绍

产品描述 本系列产品&#xff0c;是在该公司研制的专用超大规模集成电路的基础上&#xff0c;研发的点对点多业务光传输设备。此款产品提供4路视频&#xff0c;1-4路电话接口&#xff1b;1-16路开关量接口/1-8路RS232-422-485接口&#xff1b;4路千兆以太网接口&#xff08;共享…

sts 创建webservice项目_Eclipse Maven生成WebService客户端代码及测试

条件:1. Eclipse安装Axis2插件2. 导入Web Service相关包创建Maven项目导入axis2相关jar包xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">4.0.0com.soapsoap0.0.1-SNAPSHOTsoap-clientdom4jdom4j1.6.1org.a…

[渝粤教育] 中国地质大学 建筑艺术赏析 复习题

《建筑材料赏析》模拟题 一.单选题 1.离狮身人面像最近的金字塔是() A.胡夫金字塔 B.海夫拉金字塔 C.门卡乌拉金字塔 2.中国的古典建筑属于() A.砖石结构系统 B.木结构系统 C.水泥结构系统 3.伊什达门是巴比伦城的()门 A.东 B.南 C.西 D.北 4.底比斯的卡纳克阿蒙神庙是在古埃…

J2Pay –入门

入门将指导您如何通过非常简单的步骤快速开始使用J2pay。 下载 J2Pay在Maven上可用。 <dependency><groupId>com.tranxactive</groupId><artifactId>j2pay</artifactId><version>2.4.0</version></dependency>您也可以在此…

[渝粤教育] 中国地质大学 操作系统原理(新) 复习题

《操作系统原理》模拟题 选择题 1.UNIX操作系统是一个()操作系统. A.实时 B.单用户多任务 C.多道批处理 D.多用户多任务 2.Unix系统采用的文件目录结构是(). A.一级目录结构 B.二级目录结构 C.多级目录结构 D.索引目录结构 3.操作系统是一组()程序 A.文件管理 B.中断处理 C.资…

[渝粤教育] 中国地质大学 材料力学 复习题 (2)

《材料力学》模拟题 一单选题 1.直径为d的圆截面拉伸试件其标距是(). A.试件两端面之间的距离 B.试件中段等截面部分的长度 C.在试件中段的等截面部分中选取的”工作段”的长度其值为5d或10d D.在试件中段的等截面部分中选取的”工作段”的长度其值应大于10d 2.轴向拉伸的应力…

与kylin_什么是Kylin,Kylin的学习

概述Kylin定义Apache Kylin是一个开源的分布式分析引擎&#xff0c;提供Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据&#xff0c;最初由eBay开发并贡献至开源社区。它能在亚秒内查询巨大的Hive表。Kylin架构1)REST ServerREST Server是一套面向应用程…

工业轨式 1-16路 4-20MA 模拟量光端机产品介绍

产品描述 本系列设备采用大规模FPGA设计&#xff0c;采用独创技术&#xff0c;可同时支持 1~8 通道模拟量信号&#xff08;电流/电压&#xff09;到光纤中继&#xff0c;每组模拟量有24V供电输出VO脚&#xff0c;方便给传感器等设备供电。该设备采用双电源供电&#xff0c;高性…

[渝粤教育] 中国地质大学 电力系统保护原理 复习题 (2)

《电力系统保护原理》模拟题 一单选题 1.()是为补充主保护和后备保护的性能或当主保护和后备保护退出运行而增加的简单保护. A.异常运行保护 B.辅助保护 C.失灵保护 2.()的出现是区分正常运行、过负荷、系统震荡及相间短路的基本特征. A.正序分量 B.负序分量 C.零序分量 D.均可…

js移除某个class_用JS添加和删除class类名

下面介绍一下如何给一个节点添加和删除class名添加&#xff1a;节点.classList.add("类名")&#xff1b;删除&#xff1a;节点.classList.remove("类名")&#xff1b;以tab切换为例&#xff1a;在写tab切换的时候&#xff0c;通常我们会给选中的tab设置不同…

采购光纤收发器时应该注意哪些事项?

目前市场上国外和国内生产光纤收发器的厂商很多&#xff0c;产品线也极为丰富&#xff0c;光纤收发器的种类也不一&#xff0c;主要分为机架式光收发器、台式光收发器和卡式光收发器。在实际的采购中&#xff0c;企业考虑的一个重要的因素是价格。当然&#xff0c;除价格外同时…