当前位置: 首页 > backend >正文

Text Blocks:告别字符串拼接地狱

1. 背景:为什么需要 Text Blocks?

在 Java 13 之前,如果你要写一个多行字符串,比如 SQL、JSON、HTML 模板,通常会写成这样:

String sql = "SELECT id, name, age " +"FROM users " +"WHERE status = 'ACTIVE' " +"ORDER BY created_at DESC";

问题显而易见:

  • 拼接符号 + 很多,显得冗余。
  • 代码格式与原始文本差异大,不直观。
  • 引号、换行符、缩进都容易出错。

这就是所谓的 “字符串拼接地狱”


2. 什么是 Text Blocks?

Java 13 引入了 Text Blocks(文本块) 特性,并在 Java 15 成为正式语言特性。

语法很简单:

  • """(三个双引号)包裹。
  • 自动支持多行。
  • 保留文本结构,不需要大量转义。

示例:

String sql = """SELECT id, name, ageFROM usersWHERE status = 'ACTIVE'ORDER BY created_at DESC""";

优势:

  • 写法更接近原始 SQL 格式。
  • 自动处理换行。
  • 代码可读性显著提升。

3. 语法细节

3.1 基本规则

  • Text Block 以 """ 开始和结束。
  • 结束的 """ 必须单独一行,并且对齐缩进。
  • Java 会自动去除 最小公共缩进

3.2 自动换行

Text Block 中直接写换行,编译器会自动保留:

String message = """Hello,World!""";
// 输出:Hello,\nWorld!

3.3 转义字符

Text Block 仍然支持 \n\t\" 等转义。
但常见的双引号 " 不再需要转义。

String json = """{"id": 1001,"name": "Alice"}""";

4. 使用场景

4.1 SQL 查询

String query = """SELECT *FROM ordersWHERE amount > 1000AND status = 'PAID'ORDER BY created_at DESC""";

4.2 JSON 模板

String json = """{"user": {"id": 1001,"name": "Bob","roles": ["admin", "user"]}}""";

4.3 HTML / XML

String html = """<html><body><h1>Hello Text Blocks</h1></body></html>""";

4.4 日志模板

String log = """==== Application Error ====Time: %sMessage: %s==========================""".formatted(LocalDateTime.now(), "NullPointerException");

5. 对比:传统写法 vs Text Blocks

传统写法

String json = "{\n" +"    \"id\": 1001,\n" +"    \"name\": \"Charlie\"\n" +"}";

Text Blocks 写法

String json = """{"id": 1001,"name": "Charlie"}""";

✅ 可读性明显更好,不再被 \n+ 搞得眼花缭乱。


6. 总结

  • Text Blocks 解决了 Java 字符串拼接冗余、可读性差的问题。
  • 特别适合 SQL、JSON、HTML、日志模板 等多行结构化文本。
  • 代码更接近文本本身,减少了转义和拼接负担。

从 Java 15 开始,Text Blocks 已经是 正式特性,可以放心使用。


📌 一句话总结:
有了 Text Blocks,Java 程序员终于可以 写出优雅的多行字符串,彻底告别“字符串拼接地狱”!

http://www.xdnf.cn/news/18639.html

相关文章:

  • 量子链(Qtum)分布式治理协议
  • 单词搜索+回溯法
  • Linux内核ELF文件签名验证机制的设计与实现(C/C++代码实现)
  • 源滚滚React消息通知框架v1.0.2使用教程
  • 《支付回调状态异常的溯源与架构级修复》
  • 【RAGFlow代码详解-3】核心服务
  • Linux驱动之DMA(三)
  • ubuntu中网卡的 IP 及网关配置设置为永久生效
  • Maxwell学习笔记
  • 8月精选!Windows 11 25H2 【版本号:26200.5733】
  • 从技术精英到“芯”途末路:一位工程师的沉沦与救赎
  • IC验证 APB 项目(二)——框架结构(总)
  • 项目编译 --- 基于cmake ninja编译 rtos项目
  • COSMIC智能化编写工具:革命性提升软件文档生成效率
  • 20.13 ChatGLM3 QLoRA微调实战:3步实现高效低资源训练
  • Shell Case 条件语句详解
  • 数据挖掘 4.8 评估泛化能力
  • k8s原理及操作
  • Go语言环境安装
  • Spring面试题及详细答案 125道(16-25) -- 核心概念与基础2
  • Jwt令牌设置介绍
  • c++基础知识入门
  • Https之(三)TLS双向认证
  • 打响“A+H”双重上市突围战,云天励飞实力如何?
  • 云原生俱乐部-RH294知识点归纳(3)
  • [滑动窗口]1493. 删掉一个元素以后全为 1 的最长子数组
  • 今天学习计算机网格技术的TCP,UDP以及OSPF
  • 【AI智能体】Dify 搭建业务单据差异核对助手实战详解
  • 【Spring Cloud 微服务】3.智能路由器——深入理解与配置负载均衡
  • 【数据结构】从基础到实战:全面解析归并排序与计数排序