网站首页 > 技术文章 正文
继续聊Java 8之后的新特性,这周我讲下Text Blocks这个特性。
Text Blocks最开始是个JDK 14引进的,当时为预览版功能,在JDK 15中被正式确定。
这意味着如果你想使用这个功能,得考虑使用最新的LTS JDK 17才行。
这篇文章是Java 8之后的那些新特性系列的第二篇,本系列其它文章为:
文本的困扰
在Java过往的编码中,有一个问题始终不太好处理,这个问题就是:
如何方便地处理多行字符块
Java语言中并未提供任何能方便处理多行字符串的特性,导致在一些需要多行字符串的编码过程中,实现起来非常不简洁。如果多行字符串中还需要动态变量,就更麻烦了。
过往的实现方式无非是以下两种:
- 使用"\n","+"等方式来处理
- 不使用多行,整成一行来处理
举个实际的例子来说明下:
我通常在写REST层单元测试时,需要构建JSON字符串,比如在API请求中,类似的需求是很正常的吧。
在单元测试中,比如需要构建如下JSON数据,并且其中一些字段希望是随机生成的(更有利于测试)
[
{
"itemNo": "itemNo",
"contractQuotation": {
"id": "id"
},
"partNo": "partNo",
"name": "name",
"count": 1,
"price": 103
}
]
在Java中,这个多行字符串在单元测试中构建数据时,我过往是这样写的:
private String createItemJson(Long contractQuotationId) {
return "[{\"itemNo\":\"itemNO_" + UUID.randomUUID().toString() + "\",\"contractQuotation\":{\"id\":" + contractQuotationId + "},\"partNo\":\"partNo_1\",\"name\":\"name_1\",\"count\":1,\"price\":109}]";
}
当然,你也可以使用"\n","+"的方式写成多行。但无论哪个方式肯定是没有任何简洁性和优雅可言的吧。
这就是Java中的多行字符串的困境。
对比与伤害
没有对比,就没有伤害
我们还是来看下其它语言是怎么处理这样的场景的吧。
我用Kotlin与TypeScript两种语言来重写上面这个方法,这样大家就有直观的感受了。
Kotlin
fun createItemJson(contractQuotationId:Long):String{
return """
[
{
"itemNo": ${UUID.randomUUID()},
"contractQuotation": {
"id": $contractQuotationId
},
"partNo": "partNo_1",
"name": "name_1",
"count": 1,
"price": 109
}
]
""".trimIndent()
}
TypeScript
public createItemJson(contractQuotationId:number):string {
return `
[
{
"itemNo": `+this.randomString()+`,
"contractQuotation": {
"id": `+contractQuotationId+`
},
"partNo": "partNo_1",
"name": "name_1",
"count": 1,
"price": 103
}
`
}
代码胜过一切了吧,相比较下来,简洁与优雅不在同一个层次上吧。
Text Blocks
这就是Java的Text Blocks的想要解决的问题。
Java的Text Blocks完美的借鉴了其它语言在支持多行文本上的做法,其实现几乎与Kotlin看不出太大的区别。
如果我们用Java的Text Blocks来重写这个方法,那么你会看到效果是:
private String createItemJson(Long contractQuotationId) {
var json = """
[
{
"itemNo": %s,
"contractQuotation": {
"id": %s
},
"partNo": "partNo",
"name": "name",
"count": 1,
"price": 103
}
]
""";
return String.format(json,UUID.randomUUID().toString(),contractQuotationId);
}
总体来说,这个特性和其它语言的表现差不太多。
有点区别的是:
- Java字符中没有支持变量的特性,所以上述中一些变量只能考虑使用**%s**这样的变通的方式实现
更多
当然,这个特性并不是只是简单地支持多行文本这么个程度,细究起来,里面还有挺多细节可以关注。
比如
- 最后一行究竟会不会换行?
- 多行字符串的最终显示前面的空格长度是怎么控制的
- 特殊的字符有没有需要特别处理的?
关于这些,建议阅读Java Oracle官方的文档。我有一个建议需要重复一次,那就是:
对于任何语言或者框架,最先需要阅读的文档一定是官网
在我的《追求高效的程序员》这个系列中,有一个章节专门说如何高效地学习,也提及了这一点。官网的文档永远是最新的,最全的。
至于额外的一些博客,教程或书本,都要排在官网之后,有需要时再参考与补充。
这个Text Blocks的特性就聊到这里了,是不是虽然简单但非常实用呢。
最后
有时候,我们并不能随心所欲地决定一些事情,所以我会寻找另外的方案来改善它,你想知道我是如何处理上面的这种情况么?
private String buildEmployeeJsonWithUpdate(EmployeeDto dto,String name){
var jsonObject = new JsonObject();
jsonObject.addProperty("name",name);
jsonObject.addProperty("email",dto.getEmail());
jsonObject.addProperty("phone",dto.getPhone());
return jsonObject.toString();
}
我选择使用JsonObject来构建JSON字符,至少相比起来,相对是一种也不算很差的实现方式了吧。
如果你有更优雅的实现方式,请务必告知。
下周我继续和大家聊Java 8之后的新特性。
猜你喜欢
- 2025-08-26 升级JDK17的理由,核心是降低GC时间
- 2024-11-04 Dockerfile 命令详解 dockerfile常用命令
- 2024-11-04 运维日记|那些年你可能会踩的坑—xtts篇
- 2024-11-04 oracle数据库访问控制配置(白名单)
- 2024-11-04 深入浅出!十三张图带你从源码了解SpringBoot启动流程!实战篇
- 2024-11-04 linux操作命令随笔 linux系统的操作命令
- 2024-11-04 Jenkins安装配置,项目发布、管理详解,史上最清晰,值得收藏!
- 2024-11-04 0034 使用table表格标签进行网页排版
- 2024-11-04 Java课程设计报告+源码-万年历的设计与实现
- 2024-11-04 springboot快速入门 springboot超详细教程
你 发表评论:
欢迎- 最近发表
-
- 用AI做微信小程序的完整步骤_如何用ai制作微信表情包
- 自习室预约的微信小程序设计与实现-计算机毕业设计源码+LW文档
- 微信小程序开发入门指南_微信小程序开发入门教程
- 写字机器人好用吗? 组装就花了5个小时 还要学习软件、录入字体
- 白描网页版 - 高效准确且免费的OCR文字识别工具
- 字体图形面板与图标字体使用_字体图标的优势和劣势
- 作为前端工程师必须懂得的33个CSS核心概念
- Flutter程序员开发炫酷的登录页面 字体库运用 路由学习 源码分享
- 2025Q3开源字体盘点:让你的代码和文档'颜值'飙升!
- Agent杂谈:Agent的能力上下限及「Agent构建」核心技术栈调研分享~
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- oracle面试 (55)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)