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年,不支持国际化,不提供时区支持, ...
随机推荐
- pymysql基本语法,sql注入攻击,python操作pymysql,数据库导入导出及恢复数据---day38
1.pymysql基本语法 # ### python操作mysql import pymysql ''' # ### 1.基本语法 #(1) 创建连接 host user password datab ...
- Kotlin 基础入门
目录 一.基础语法 1.1 常见数据类型 1.2 变量 1.2.1 变量声明 1.2.2 类型推断 1.2.3 Null 安全 1.2.4 面向对象语言 1.3 流程控制 1.3.1 if 表达式 1 ...
- 现代 CSS 解决方案:accent-color 强调色
accent-color 是从 Chrome 93 开始被得到支持的一个不算太新属性.之前一直没有好好介绍一下这个属性.直到最近在给一些系统整体切换主题色的时候,更深入的了解了一下这个属性. 简单而言 ...
- 【ACM专项练习#01】基本输入输出,如何加减
关于ACM,牛客其实也有专门的模拟练习:https://ac.nowcoder.com/acm/contest/5657#question 做这个也可以 关于while(cin>>n) 在 ...
- DataGear 使用静态HTML模板制作数据可视化看板
DataGear 看板提供了导入静态 HTML 模板的功能,使您可以利用已有的任意 HTML 网页资源快速制作数据可视化看板. 首先,您需要准备一套已设置好布局的静态 HTML 模板,其中包含的 HT ...
- CentOS系统下,配制nginx访问favicon.ico
sudo vim /etc/nginx/nginx.conf 添加以下配制: # set site faviconlocation /favicon.ico { root html;} 完整配置如下: ...
- 【Azure 应用服务】App Service For Linux 环境中,如何修改 Nginx 配置中 server_name的默认值 example.com
问题描述 在App Service for Linux环境中,部署PHP应用,使用Nginx服务器.因为PHP应用中所有静态资源的URL使用的默认域名为 https://example.com:808 ...
- 【Azure 微服务】记一次错误的更新Service Fabric 证书而引发的集群崩溃而只能重建
问题描述 错误的操作步骤: 1)更新Service Fabric 的证书,制定了次要证书(Secondary),但是只修改了Service Fabric Cluster证书,而没有指定VMSS(虚拟机 ...
- [Linux] 无显示器 无键盘 网线直连传输文件
有显示器可以操作 这种情况下要简单的多,基本思想是,网线直连之后让其中一方当作网关,分配好ip地址,比如说192.168.8.1,网关也是192.168.8.1即可,如果要填写子网掩码就写255.25 ...
- 手撕fft算法--fft原理和源码解析
一 前言 在音频信号处理中,fft变换是一个无法绕过过去的存在.借着一次算法出来的机会,把fft熟悉一下不为过啊. 二 问题 这里,其实是由一个问题驱动的,那就是:怎么通过fft的变化来得 ...