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

你还在用 `+ “\\n“` 拼多行字符串吗?Java 的文本块都已经能让代码“像人写的”了!

👋你好,欢迎来到我的博客!我是【菜鸟不学编程】
我是一个正在奋斗中的职场码农,步入职场多年,正在从“小码农”慢慢成长为有深度、有思考的技术人。在这条不断进阶的路上,我决定记录下自己的学习与成长过程,也希望通过博客结识更多志同道合的朋友。

🛠️ 主要方向包括 Java 基础、Spring 全家桶、数据库优化、项目实战等,也会分享一些踩坑经历与面试复盘,希望能为还在迷茫中的你提供一些参考。
💡 我相信:写作是一种思考的过程,分享是一种进步的方式。

如果你和我一样热爱技术、热爱成长,欢迎关注我,一起交流进步!

全文目录:

    • I. 文本块语法:`""" 多行字符串 """`
      • 1)基本用法:三引号包起来
      • 2)起始行的“小规矩”
    • II. 转义与缩进:自动处理空格(但别误会它“会读心”)
      • 1)缩进裁剪:它会找“最小公共缩进”
      • 2)想控制末尾换行?用 `\`(行尾反斜杠)
      • 3)需要在行尾保留空格?用 `\s`
    • III. 格式化:`String::formatted` 方法(终于不用满屏 `+` 了)
      • 1)示例:生成一段 JSON
      • 2)小心“格式化注入”(别在高风险输入上裸奔)
    • IV. 与传统字符串比较:可读性提升(不是“语法糖”,是“维护成本下降”)
      • 1)传统写法:拼接 + 转义 + 换行符
      • 2)文本块写法:结构就是结构
    • V. HTML/JSON 应用:嵌入多行文本(最常见、最值得)
      • 1)SQL:别再在字符串里“逃逸人生”
      • 2)JSON:结构清晰,编辑成本低
      • 3)HTML:用于邮件模板/报表渲染
    • VI. 项目:生成报告的文本块使用(一个“像工程”的小报表)
      • 1)定义一个简单的数据模型
      • 2)用文本块生成 Markdown 报告
      • 3)用文本块生成 HTML 报告(简单版)
      • 4)跑一个 demo(生成两份报告字符串)
    • 小结:文本块不是“更短”,是“更不容易写错”
    • 📝 写在最后

I. 文本块语法:""" 多行字符串 """

文本块最直观的优点就是:多行就是多行,不需要你手动写换行符。

1)基本用法:三引号包起来

Stringsql=""" SELECT id, name, created_at FROM users WHERE status = 'ACTIVE' ORDER BY created_at DESC """;

你看,字符串里有换行、缩进,代码也有换行、缩进——读起来像你脑子里想的样子

2)起始行的“小规矩”

  • 开始的"""后面通常换行(更清晰)
  • 结束的"""所在位置会影响缩进裁剪(下一节讲)

II. 转义与缩进:自动处理空格(但别误会它“会读心”)

文本块有两个“真香点”:

  1. 自动处理缩进(indentation stripping)
  2. 减少转义需求

1)缩进裁剪:它会找“最小公共缩进”

看这个例子:

Strings=""" line1 line2 line3 """;System.out.println(s);

输出会保留相对缩进,但会裁掉“所有行共有的最小缩进”。
这意味着:你可以为了让代码排版好看而缩进,但最终字符串不会多出那些“为了对齐而产生的多余空格”。

重点:它保留相对缩进,不是把所有行都左对齐。

2)想控制末尾换行?用\(行尾反斜杠)

文本块默认会包含结尾换行(多数时候是你想要的)。
但如果你不想要最后那个换行:

StringnoTrailingNewline=""" hello world\""";

这个\会把最后的换行“吃掉”。
(第一次见的人一般会“啊?”一下,正常😄)

3)需要在行尾保留空格?用\s

有时候你想保留行尾空格(例如 Markdown 对齐、某些固定格式输出),文本块会帮你裁剪得太“干净”。这时你可以显式保留:

StringkeepSpace=""" a\s b\s """;

III. 格式化:String::formatted方法(终于不用满屏+了)

文本块和formatted()简直是天生一对:
你写一个模板,再把变量填进去,代码立刻从“拼接现场”变成“模板渲染”。

1)示例:生成一段 JSON

Stringname="Ophelia";intscore=97;Stringjson=""" { "name": "%s", "score": %d, "passed": %b } """.formatted(name,score,score>=60);System.out.println(json);

你会发现它比String.format(...)更顺手的地方在于:
模板字符串就在那儿,你一眼能看到结构,不用在参数列表里找半天。

当然,它底层还是走 format 语义,格式符%s/%d/%f那些规则都一样。

2)小心“格式化注入”(别在高风险输入上裸奔)

如果用户输入里可能包含%,在某些场景会造成格式化异常或输出混乱。
高风险场景请先转义或用更安全的模板渲染方式(尤其是日志/SQL/命令行这类)。

IV. 与传统字符串比较:可读性提升(不是“语法糖”,是“维护成本下降”)

我们来对比一下经典的“字符串地狱”。

1)传统写法:拼接 + 转义 + 换行符

Stringhtml="<html>\n"+" <body>\n"+" <h1>Report</h1>\n"+" </body>\n"+"</html>\n";

读起来像在数\n,写起来像在搬砖,还容易漏掉引号。

2)文本块写法:结构就是结构

Stringhtml=""" <html> <body> <h1>Report</h1> </body> </html> """;

维护体验差别非常大

  • 改一行 HTML,不会牵动 10 行拼接
  • diff 更干净,代码审查也更容易
  • 少了很多“我是不是漏了个+”的低级错误

所以它不是仅仅“少写几个字符”,而是:降低未来维护者(包括你自己)脑内负担

V. HTML/JSON 应用:嵌入多行文本(最常见、最值得)

文本块最舒服的用途就是放这些“结构化文本”:

1)SQL:别再在字符串里“逃逸人生”

Stringsql=""" SELECT id, name FROM users WHERE age >= %d ORDER BY name """.formatted(18);

2)JSON:结构清晰,编辑成本低

Stringpayload=""" { "event": "login", "userId": "%s", "timestamp": "%s" } """.formatted("u-42",java.time.Instant.now());

3)HTML:用于邮件模板/报表渲染

Stringpage=""" <div class="card"> <h2>%s</h2> <p>%s</p> </div> """.formatted("Weekly Report","All systems nominal.");

但我得提醒一句:如果你在做复杂 HTML 模板,文本块只是“字符串更好写”,它不是模板引擎。复杂场景建议用真正的模板方案(比如 Thymeleaf/Freemarker 等),别硬撑🙂。

VI. 项目:生成报告的文本块使用(一个“像工程”的小报表)

我们做个小项目:生成一份“运行报告”,同时输出MarkdownHTML两种格式。
为什么是这两种?因为它们最能体现文本块的价值:结构化、多行、可读。

1)定义一个简单的数据模型

importjava.time.Instant;importjava.util.List;publicrecordReport(Stringtitle,InstantgeneratedAt,List<Item>items){publicrecordItem(Stringname,Stringstatus,longlatencyMs){}}

2)用文本块生成 Markdown 报告

importjava.util.stream.Collectors;publicclassReportRenderer{publicstaticStringtoMarkdown(Reportr){Stringrows=r.items().stream().map(i->"| %s | %s | %dms |".formatted(i.name(),i.status(),i.latencyMs())).collect(Collectors.joining("\n"));return""" # %s - Generated At: %s - Total Items: %d | Name | Status | Latency | | ---|--------|---------| %s > Note: Latency is measured at client side. """.formatted(r.title(),r.generatedAt(),r.items().size(),rows);}}

你会发现:Markdown 的“表格块”在文本块里写起来特别顺,不会被\n折磨。

3)用文本块生成 HTML 报告(简单版)

importjava.util.stream.Collectors;publicclassHtmlReportRenderer{publicstaticStringtoHtml(Reportr){Stringrows=r.items().stream().map(i->""" <tr> <td>%s</td> <td>%s</td> <td>%d ms</td> </tr> """.formatted(escape(i.name()),escape(i.status()),i.latencyMs())).collect(Collectors.joining("\n"));return""" <!doctype html> <html lang="en"> <head> <meta charset="utf-8"/> <title>%s</title> <style> body { font-family: Arial, sans-serif; margin: 24px; } table { border-collapse: collapse; width: 100%%; } th, td { border: 1px solid #ddd; padding: 8px; } th { text-align: left; } </style> </head> <body> <h1>%s</h1> <p><b>Generated At:</b> %s</p> <table> <thead> <tr><th>Name</th><th>Status</th><th>Latency</th></tr> </thead> <tbody> %s </tbody> </table> </body> </html> """.formatted(escape(r.title()),escape(r.title()),r.generatedAt(),rows);}privatestaticStringescape(Strings){if(s==null)return"";returns.replace("&","&amp;").replace("<","&lt;").replace(">","&gt;").replace("\"","&quot;");}}

注意一个小细节:CSS 里有100%,在formatted()模板中%是格式符起始,所以要写100%%
这类“百分号小坑”在模板里很常见,别踩一次才记住😅。

4)跑一个 demo(生成两份报告字符串)

importjava.time.Instant;importjava.util.List;publicclassReportDemo{publicstaticvoidmain(String[]args){Reportreport=newReport("Service Health Report",Instant.now(),List.of(newReport.Item("UserService","OK",23),newReport.Item("OrderService","WARN",187),newReport.Item("PaymentService","FAIL",0)));Stringmd=ReportRenderer.toMarkdown(report);Stringhtml=HtmlReportRenderer.toHtml(report);System.out.println(md);System.out.println("------");System.out.println(html.substring(0,Math.min(400,html.length()))+"...");}}

小结:文本块不是“更短”,是“更不容易写错”

Java 文本块最值钱的地方不是省了多少字符,而是:

  • 结构可读:HTML/JSON/SQL 这类文本“长得像它本来的样子”
  • 少转义:减少\n\t\"这种视觉噪音
  • 更好维护:代码 diff 更干净,评审更轻松
  • 搭配 formatted:模板化输出更自然

最后我想用一句反问收尾(你应该已经习惯我这种嘴欠式结尾了😄):
你写的多行字符串,是在表达“内容”,还是在表达“转义规则”?
如果答案是后者——那文本块真的该用起来了🙂。

📝 写在最后

如果你觉得这篇文章对你有帮助,或者有任何想法、建议,欢迎在评论区留言交流!你的每一个点赞 👍、收藏 ⭐、关注 ❤️,都是我持续更新的最大动力!

我是一个在代码世界里不断摸索的小码农,愿我们都能在成长的路上越走越远,越学越强!

感谢你的阅读,我们下篇文章再见~👋

✍️ 作者:某个被流“治愈”过的 Java 老兵
📅 日期:2025-08-25
🧵 本文原创,转载请注明出处。

http://www.jsqmd.com/news/987804/

相关文章:

  • 2026年郑州航空港区长短途搬家运输公司:设备搬迁、企业搬迁、机场货物搬卸分析报告 - 品研笔录
  • 无代码测试革命:Hercules如何用AI重构软件质量保障体系
  • Claudian插件终极指南:如何用AI助手提升Obsidian知识管理效率
  • 深入理解 Apache Flink 可扩展状态
  • 石家庄专业车灯升级门店排行 资质与服务实测对比 - 起跑123
  • 【信息科学与工程学】计算机科学与自动化/控制——第九十二篇 自动化控制01
  • 2026东莞GEO优化公司实力排名!实测技术、案例、效果综合对比 - 新闻快传
  • 2026防爆型气体采样探头厂家排行榜:工业安全监测核心部件选购攻略 - 品研笔录
  • 2026年必备收藏:解决AIGC烦恼的免费实用网站
  • 2026 纺织服饰配套优选:复合型高周波热转印标定制厂家严选 - 变量人生001
  • N_m3u8DL-RE终极指南:3步破解流媒体下载难题
  • 5、【AI产品经理概述】行业现状与职业前景
  • 2026年 重庆摆闸/人行通道闸/三辊闸/翼闸最新推荐榜单:厂家实力与稳定耐用的选型指南 - 品牌发掘
  • 2026上海高端手表回收:江诗丹顿回收市场行情解析 - 奢侈品回收评测
  • 2026年郑州航空港区公司企业搬迁公司全景分析:深度测评选对团队少走弯路! - 品研笔录
  • 2026广州楼梯房翻新室内设计公司排行实测 - 互联网科技品牌测评
  • 2026年|如何快速去除论文AI痕迹?10款智能工具高效降低AI率
  • 前后端模块化分离实战:从零搭建用户列表展示(HTML+CSS+JS + json-server)
  • 【干货】DeepSeek / 豆包数学公式完美转 Word 攻略!告别乱码,效率翻倍!AI 导出鸭一键快速转换公式
  • 从Keil到VScode的一站式服务(stm32和GD32)
  • VXGI未来发展方向:基于体素的全局光照技术路线图展望
  • 包包回收行业避坑总结,合肥 2026 连锁商铺诚信经营 - 奢侈品回收评测
  • 2026上海落户代办机构深度评测与避坑指南 - 新闻快传
  • C++:初始化列表
  • 【单智能体】AI健康与健身规划师 - 案例讲解(附完整源码)
  • 2026年吹膜机厂家推荐榜单:PE吹膜机/降解袋吹膜机/快递袋/背心袋/ABA共挤/全自动/小型/多层共挤吹膜机品牌实力精选 - 品牌发掘
  • 2026年上海注册公司代理记账哪家好?五大品牌深度测评与对比 - 新闻快传
  • 2026年展柜厂家推荐榜单:内衣展柜/酒柜/鞋柜/眼镜柜/珠宝展柜,专业定制与空间美学深度解析 - 企业推荐官【官方】
  • 宝塔面板如何设置网站伪静态 宝塔|Nginx网站部署 伪静态配置|静态资源访问配置
  • 2026东莞配眼镜镜片膜层工艺深度解析:防反射、耐磨、疏水三大镀膜技术详解 - 配眼镜新资讯