深入剖析 Java 新特性
范学雷
前 Oracle 首席软件工程师,Java SE 安全组成员,OpenJDK 评审成员
16539 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 23 讲
深入剖析 Java 新特性
15
15
1.0x
00:00/00:00
登录|注册

02 | 文字块:怎么编写所见即所得的字符串?

你好,我是范学雷。今天,我们聊一聊 Java 的文字块(text blocks)。
文字块这个特性,首先在 JDK 13 中以预览版的形式发布。在 JDK 14 中,改进的文字块再次以预览版的形式发布。最后,文字块在 JDK 15 正式发布。
文字块的概念很简单,它是一个由多行文字构成的字符串。既然是字符串,为什么还需要文字块这个新概念呢?文字块和字符串又有什么区别呢?我们还是通过案例和代码,来弄清楚这些问题吧。

阅读案例

我们在编写代码的时候,总是或多或少地要和字符串打交道。有些字符串很简单,比如我们都知道的"Hello,World!"字符串。有些字符串很复杂,里面可能有换行、对齐、转义字符、占位符、连接符等。
比如下面的例子中,我们要构造一个简单的表示"Hello,World!"的 HTML 字符串,就需要处理好文本对齐、换行字符、连接符以及双引号的转义字符。这就使得这段代码既不美观、也不简约,一点都不自然。
String stringBlock =
"<!DOCTYPE html>\n" +
"<html>\n" +
" <body>\n" +
" <h1>\"Hello World!\"</h1>\n" +
" </body>\n" +
"</html>\n";
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Java中的文字块(text blocks)是一个新的字符串表示形式,由多行文字构成,消除了传统字符串处理中的换行、连接符、转义字符等问题,使得多行文字字符串的表达更加简洁清晰。文字块在编译期被转换成常量字符串,可以使用字符串的各种API和操作方法。通过文字块,开发者可以更加方便地处理HTML、SQL、XML、JSON等复杂字符串,提高代码的可读性和质量。文字块的出现为Java语言带来了“所见即所得”的编程体验,使得开发者能够更加高效地处理复杂字符串,提升代码质量和开发效率。文字块还引入了新的转义字符,如空格转义符和换行转义符,以支持尾部空格和长段落的表达。文章还提到了文字块的编译细分步骤和处理规则,以及在面试中可能涉及的问题和技术要点。文章最后提出了一个思考题,探讨了文字块在处理居中对齐等特殊场景时的应用。整体而言,文字块为Java开发者带来了更加便捷和清晰的字符串处理方式,提高了代码的可读性和开发效率。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入剖析 Java 新特性》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(20)

  • 最新
  • 精选
  • 人要活泼些才好
    置顶
    本篇主要讲了几点: 1. 认识 textarea 是什么?基本语法是什么? 2. textarea 和 原始的长字符串处理方式产生的对象指向同一内存地址。 3.文字块可以调用字符串 String 的 API 。 4.可以使用嵌入式的表达式 。 5. textarea 是如何处理共享的前导空格的。 6. 需要保留 textarea 怎么办?添加一个 \s 即可保留 此行 '\s' 及之前的空格。 7.如何在遵守编码规范的前提下处理长段落:在需要断行的地方 添加 \ 即可。

    作者回复: 建议置顶! 可惜我不知道有没有置顶的功能。 如果点赞可以帮助置顶的话,小伙伴们都来点赞吧。总结的太好了!

    2021-11-17
    2
    34
  • 森林
    老师,java啥时候支持字符串插值。

    作者回复: 这个特性,我还不知道是不是有计划。 现在有替换的方案,虽然没有字符串差值简单,所以可能不是很紧急。 如果觉得这个好,可以去OpenJDK提议,推动它的早日支持。

    2021-11-17
    2
  • getouo
    什么时候能支持字符串插值啊

    作者回复: 出现了两次,看来这个需求很旺盛啊。你想去OpenJDK提交一个新特性的申请吗?

    2021-11-17
    5
    2
  • Calvin
    老师,看完这节,我有点疑问,想请教一下: 1:编译过程去除共享的前导空格,这个可以理解是为了处理代码缩进,但是为什么文本行后面的空格也要设计为去除呢?这样设计的初衷是什么呀?(这样设计,为了保留后面的空格还要使用\s转义,感觉反而更麻烦了!) 2:这里说的是去除空格,万一是tab缩进的呢?前后的tab也能去除吗? 3:后置结束符是“"""”,如果我文本块内容最后一个字符也是“"”而且是不换行的,那么最终就是4个“"”结尾,这样也是没问题的对吗? 4:如果我文本块内容中间就有“"""”,这跟后置结束符一样,编译器是否能识别它并非真正的结束符?如果不能,有没有什么办法转义呢? 5:对于长文本不换行转义符“\”,文中只说了前面有空格的情况,如果它后面也还有空格或者tab,是否能达到不换行的效果呢? 6:对于文中说到的转义符“\s”和“\”,如果我不想让它们作为转义符(当普通文本输出),需要怎么再转义? PS:文中说到“\”不换行转义符时,是有笔误吗?刚看一头雾水,看例子才知道应该是“\”,原文针对这种情况, 文字块引入了一个新的转义字符,‘< 行终止符 >’,换行转义符。

    作者回复: 1). 通常状况下,行末的空格都是不必要,毕竟看不到。这样设计,省去了肉眼判断行末是否有空格的麻烦。 毕竟,有空格肉眼不好看,而转义字符就清晰很多了。 多数情况下,行末的转义字符应该用不上。 2),3),5)的答案,建议你试一试。 4)使用转义字符,\"""。6)继续使用转义字符。这和普通的字符串的转义字符的用法是一致的。 PS:有可能是词语选择的偏好导致的。“不换行转义符”和“换行转义符”似乎都有可能导致理解偏差。 小伙伴们,也帮我想一想有没有更好的表达方式。

    2021-11-18
    4
    1
  • aoe
    还是Go中的``用起来方便啊。""" """确实也方便了很多,但是平时用的真不多,复杂的文字一般都会从模板中读取/展示,例如:MyBatis的XML文件、Yaml文件、FreeMarker、Thymeleaf等

    作者回复: 嗯,场景不同,使用方式差别很大。 从模版中读取是一个值得小伙伴们学习的好办法。 我自己的代码很多要记日志,这个特性算是解放了我可怜的眼睛。

    2021-11-17
    4
    1
  • 人要活泼些才好
    直接添加缩进空格的实现 String poem = """ No man is an island, entire of itself, every man is a piece of the continent, a part of the main. """;

    作者回复: 很遗憾极客时间的评论不能准确地显示源代码。时间允许的话,你可以试一试专栏的GitHub的PR请求。每一讲的末尾,都有一个注解,提醒大家怎么获得源代码,怎么提交PR请求。

    2021-11-17
    2
    1
  • 码小呆
    文字块特性,说实话,在实际工作中,很难遇到使用情况,最多就在学习的过程中已经测试的过程中会使用到,毕竟现在 谁在工作中用servlet 去 做转发或者 重定向这种操作呢

    作者回复: 实际使用已经很多了。

    2022-07-06
  • giteebravo
    本节理解了文字块的基本概念及其使用方式, 会有意识地在代码里使用文字块。

    作者回复: 嗯,学到的就赶快用上。

    2021-11-27
  • 李阳
    写scala经常用。是很方便

    作者回复: 是的。

    2021-11-24
  • Jagger Chen
    https://github.com/XueleiFan/java-up/pull/6

    作者回复: 收到,有一个小的注释,已经merge了。

    2021-11-21
收起评论
显示
设置
留言
20
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部