JDK 14的新特性:文本块Text Blocks
说起来,Text Blocks是在JDK13中以第一次预览版本引入的。现在在JDK14中是第二次预览版本 JEP 368: Text Blocks。
在我们日常的工作中,有时候需要用到一大段的字符串,这些字符串需要换行,需要排版,需要转义。在一个文本编辑器中,这当然是非常容易的事情。但是在java代码中,就是一个噩梦了。
虽然IDE可以自动帮我们加上换行甚至可以对字符串进行拼接。但在java程序眼中,添加的诸多额外的代码破坏了代码的美感。是任何一个有洁癖的程序员都无法忍受的。
怎么办? Text Blocks就是来解救大家的。
举个例子
我们先来个直观的例子,然后再分析Text Blocks的特点。
还是举HTML的例子,如果我们想要打印出带缩减,有格式的html,传统方法可以这样做:
String html = "<html>\n" +
" <body>\n" +
" <p>Hello, world</p>\n" +
" </body>\n" +
"</html>\n";
上面的代码看着特别别扭,让我们看看用文本块方式怎么做:
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
是不是清爽很多,想要立即给文本块点个赞。
别慌点赞,我们还有更多的东西要讨论。
Indentation编排
可能有人又有问题了,文本块好用是好用,你这输出结果中,字段前面的空格都去哪了了呀?
这里就要介绍这个概念了:英文名字叫Indentation,中文我把它翻译为编排。
再看一下上面的代码,这一次我们把代码前面的空格以点来表示:
String html = """
..............<html>
.............. <body>
.............. <p>Hello, world</p>
.............. </body>
..............</html>
..............""";
Indentation的规则就是以最下面的“”“为界,对每一行都移除相同数量的空格。
上面的代码输出:
<html>
<body>
<p>Hello, world</p>
</body>
</html>
上面的例子,最下面的”“”刚好在最左边的位置,如果把“”“向右移动4个空格会发生什么呢?
String html = """
..............<html>
.............. <body>
.............. <p>Hello, world</p>
.............. </body>
..............</html>
..................""";
输出结果:
<html>
<body>
<p>Hello, world</p>
</body>
</html>
我们看到输出结果是不变的,这样我们又得到一条结论:如果”“”向右移动,则以text block中最左的那一行记录为准。
如果我们把“”“向左移动四位,就会发现最终的输出结果每行前面都有四个空格。
这个功能是和String添加的新的String::stripIndent()对于的。
Escaping转义
还是看一个直观的例子:
@Test
public void useEscape(){
String code =
"""
"
""
\s\s\s\s\s保留这行前面的空白
String text = \"""
这里展示的是escape的用法!
\""";
跟大家说个密码,这一行很长,我准备分行\
来写,哈哈!
""";
log.info("{}",code);
}
输出结果:
”
""
保留这行前面的空白
String text = """
这里展示的是escape的用法!
""";
跟大家说个密码,这一行很长,我准备分行来写,哈哈!
首先可以看到一个双引号和两个双引号都是不用转义的,直接写就行了。三个双引号就需要转义了。
另外\s表示的是一个空格。在需要的时候可以使用。
在一行结尾直接插入\,表示这一行太长了,还没结束。
注意在Text Block中,不管是windows的回车,换行符还是linux的换行符都会转义成为换行符。
这个转义功能也对于了String的新方法translateEscapes()。
formatted格式化
最后介绍一下Text block的格式化,和String的格式化是一样的,举个SQL的例子:
@Test
public void useMethod(){
String query1 = """
SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
WHERE `CITY` = '%s'
ORDER BY `EMP_ID`, `LAST_NAME`;
""";
log.info(query1.formatted("我是一个参数"));
}
输出结果:
SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
WHERE `CITY` = '我是一个参数'
ORDER BY `EMP_ID`, `LAST_NAME`;
上面的例子中,我们使用%s来定义占位符。
总结
虽然Text Block好用,但可惜还是预览版本,正式版本可能要等JDK15了。
本文的例子https://github.com/ddean2009/learn-java-base-9-to-20
本文作者:flydean程序那些事
本文链接:http://www.flydean.com/jdk-14-text-blocks/
本文来源:flydean的博客
欢迎关注我的公众号:程序那些事,更多精彩等着您!
JDK 14的新特性:文本块Text Blocks的更多相关文章
- JDK 14的新特性:instanceof模式匹配
JDK 14的新特性:instanceof模式匹配 JDK14在2020年的3月正式发布了.可惜的是正式特性只包含了最新的Switch表达式,而Records,patterns,text blocks ...
- JDK 14的新特性:更加好用的NullPointerExceptions
JDK 14的新特性:更加好用的NullPointerExceptions 让99%的java程序员都头痛的异常就是NullPointerExceptions了.NullPointerExceptio ...
- Java13新特性 -- 文本块
在JDK 12中引入了Raw String Literals特性,但在发布之前就放弃了.这个JEP与引入多行字符串文字(text block) 在意义上是类似的. 这条新特性跟 Kotlin 里的文本 ...
- Java 15 正式发布, 14 个新特性,刷新你的认知!!
JDK 15 2020/09/15 如期而至! 这个时间牛逼啊,和苹果发布会同天? OracleJDK 15 发布地址: https://www.oracle.com/java/technologie ...
- 译文《全新首发JDK 16全部新特性》
封面:洛小汐 译者:潘潘 JDK 8 的新特性都还没摸透,JDK 16 的新特性就提着刀来了. 郑重申明: 第一次冒险翻译专业领域的文献,可想而知,效果特别糟糕.一般翻译文献特别是 技术专业领域 的内 ...
- Java JDK 1.7 和 JDK 1.8 新特性
0 引言 本文主要介绍 Java JDK 中 1.7 和 1.8 的新特性. 1 JDK 1.7 新特性 1. switch可以接受String类型: public class Switch { pu ...
- JDK 5 ~ 10 新特性倾情整理!
JDK 5 ~ 10 新特性倾情整理! 最近连 JDK11都在准备发布的路上了,大家都整明白了吗?也许现在大部分人还在用6-8,8的新特性都没用熟,9刚出不久,10-11就不用说了. 为了大家对JDK ...
- java8 (jdk 1.8) 新特性——Lambda
java8 (jdk 1.8) 新特性 --初步认识 1. 什么是lambda? 目前已知的是,有个箭头 -> 说一大段官方话,也没有任何意义 我们直接看代码: 之前我们创建线程是这样的 Ru ...
- JDK各版本新特性!
1.JDK1.5 新特性 1.自动装箱与拆箱:自动装箱的过程:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装中.自动拆箱的过程:每当需要一个值时,被装箱对象中的值就被自动地提取 ...
- JDK 1.8 新特性之Date-Time API
来源:请点击查看 1.8之前的日期类: 线程不安全:java.util.Date 这个类线程不安全,而且所有日期类都是可变的. 时间处理麻烦:默认的开始日期从1900年,不支持国际化,不提供时区支持, ...
随机推荐
- 关于json序列化时报错json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
1.今天在写客户端与服务端交互的程序的时候,发现了一个问题 客户端代码 #客户端程序主要是发送注册请求/登录请求给服务端,服务端接收响应后回应对应的应答给客户端,客户端接收响应后,然后做一些操作 # ...
- PRINCE2系列一基于项目情境自定义解决方案
PRINCE2(PRojects IN Controlled Environments,受控环境下的项目管理) 对项目进行了如下定义:项目是按照一个被批准的商业论证,为了交付一个或多个商业产品而创建的 ...
- 青少年CTF-Crypto(新手版本2.0,无factor1)
凯撒大帝的征讨之路 题目: lnixoa{1x2azz7w8axyva7y1z2320vxy6v97v9a} 知识点:凯撒加密 我的题解: import base64 #shift得出移位多少,移位后 ...
- Thinkphp6 自定义命令创建类文件
以创建控制器为例 1.先通过 think 命令创建一个make文件,效果如下图: php think make:command make/MyController 2.修改上面创建的文件[MyCont ...
- C 语言字符串操作总结
C 语言字符串操作总结 一.字符串操作 size_t 是一个无符号整型. 1.1 strcpy 函数原型:char *strcpy(char *dest, const char *src). 功 能: ...
- mysql for update是锁表还是锁行
转载至我的博客 https://www.infrastack.cn ,公众号:架构成长指南 在并发一致性控制场景中,我们常常用for update悲观锁来进行一致性的保证,但是如果不了解它的机制,就进 ...
- 4时4态 加被动 例句:I will have been being done - will have be be do - 频率副词位置
4时4态 频率副词的用法和位置:放在实义动词之前.放在be 动词之后.放在情态动词之后. 频率副词的位置一般是放在实义动词之前.放在be 动词之后.放在情态动词之后.放在be动词之后:She is s ...
- 【大语言模型基础】-详解Transformer原理
一.Transformer Transformer最开始用于机器翻译任务,其架构是seq2seq的编码器解码器架构.其核心是自注意力机制: 每个输入都可以看到全局信息,从而缓解RNN的长期依赖问题. ...
- 基于python的密码生成器实例解析
一 概念 密码生成不复杂,可是它却涉及到了string的常用技巧和一些概念 记得python中的random模块,这是所有随机数的藏身之处 记得python中的string模块,这个是字符操作的盛 ...
- springboot listener、filter登录实战
转载自: www.javaman.cn 博客系统访问: http://175.24.198.63:9090/front/index 登录功能 1.前端页面 采用的是layui-admin框架,文中的验 ...