在日常写Java的时候,对于字符串的操作是非常普遍的,其中最常见的就是对字符串的组织。也因为这个操作非常普遍,所以诞生了很多方案,总下来大概有这么几种:

  • 使用+拼接
  • 使用StringBuffer和SpringBuilder
  • String::format and String::formatted
  • 使用java.text.MessageFormat

下面,我们一起来学习一下Java 21中的新方案!如果您对于上面这些还不熟悉的话,建议可以先看一下这篇《Java自带的4种字符串组织和格式化方法》,了解以前的机制,这样与最新的处理方案做对比,理解会更深刻。

模版表达式

在Java 21中处理字符串的新方法称为:Template Expressions,即:模版表达式。

模版表达式是Java语言中的一种新表达式。它可以执行字符串插值,帮助开发人员通过编程的方式安全高效地组织字符串。此外,模板表达式不仅仅可以用于组织字符串,它还可以根据特定模型的规则将结构化文本转换为任何类型的对象。

下面通过一个简单的案例来认识一下它:

String blog = "blog.didispace.com";
String str = STR."My blog is \{blog}";

上述代码中的第2行就是一个模版表达式,其中主要包含三个部分:

  • 模版处理器:STR
  • 包含内嵌表达式(\{blog})的模版
  • 通过.把前面两部分组合起来,形式上类似方法调用

当模版表达式运行的时候,模版处理器会将模版内容与内嵌表达式的值组合起来,生成结果,所以上面案例中的字符串str在运行时的结果为:My blog is blog.didispace.com。

多行模版表达式

还记得之前我们的Java新特性专栏中,介绍过Java 15中的文本块特性吗?类似下面这样的写法:

String html = """
<html>
<body>
<h1>Java 15 新特性:文本块 | 程序猿DD</h1>
<p>didispace.com</p>
</body>
</html>
""";

模版表达式也支持类似的多行字符串处理,所以开发者可以用它来方便的组织html、json、xml等字符串内容,比如下面这样:

var json = STR."""
{
"user": "\{name}",
"age: \{age}
}
""";

STR模版处理器

上面案例中我们所用的STR模版处理器中的内嵌表达式都采用了字符串内容,而实际上STR模版处理器还有更多的用途。

  1. 内嵌表达式中还可以之前数学运算,比如:
int x = 10, y = 20;
String s = STR."\{x} + \{y} = \{x + y}";

最终s字符串结果为:10 + 20 = 30

  1. 内嵌表达式中还可以调用方法,比如:
String s = STR."My blog is \{getMyBlog()}";

假设getMyBlog方法返回的内容为blog.didispace.com,那么最终s字符串结果为:My blog is blog.didispace.com。

  1. 内嵌表达式中还可以访问对象的成员变量,比如:
User u = new User("didi", "blog.didispace.com"); // 构造函数参数为name属性和blog属性
String s = STR."\{u.name}的博客地地址为:+ \{u.blog}";

最终s字符串结果为:didi的博客地址为:blog.didispace.com。

FMT模版处理器

除了STR模版处理器之外,Java中还提供了另外一个模版处理器:FMT。FMT模版处理器除了与STR模版处理器一样提供插值能力之外,还提供了左侧的格式化处理。下面通过例子来直接理解FMT的功能:

record Rectangle(String name, double width, double height) {
double area() {
return width * height;
}
}
Rectangle[] zone = new Rectangle[] {
new Rectangle("Alfa", 17.8, 31.4),
new Rectangle("Bravo", 9.6, 12.4),
new Rectangle("Charlie", 7.1, 11.23),
};
String table = STR."""
Description Width Height Area
\{zone[0].name} \{zone[0].width} \{zone[0].height} \{zone[0].area()}
\{zone[1].name} \{zone[1].width} \{zone[1].height} \{zone[1].area()}
\{zone[2].name} \{zone[2].width} \{zone[2].height} \{zone[2].area()}
Total \{zone[0].area() + zone[1].area() + zone[2].area()}
""";

上面这块是由STR模版处理器组织字符串表格数据,从模版表达式来看是非常整齐的,但是由于模版中内嵌表达式的值长短不一,最终输出结果很有可能差强人意,比如STR模版处理器处理后的结果是这样的:

Description  Width  Height  Area
Alfa 17.8 31.4 558.92
Bravo 9.6 12.4 119.03999999999999
Charlie 7.1 11.23 79.733
Total 757.693

为了解决这个问题,就可以采用FMT模版处理器,在每一列左侧定义格式

String table = FMT."""
Description Width Height Area
%-12s\{zone[0].name} %7.2f\{zone[0].width} %7.2f\{zone[0].height} %7.2f\{zone[0].area()}
%-12s\{zone[1].name} %7.2f\{zone[1].width} %7.2f\{zone[1].height} %7.2f\{zone[1].area()}
%-12s\{zone[2].name} %7.2f\{zone[2].width} %7.2f\{zone[2].height} %7.2f\{zone[2].area()}
\{" ".repeat(28)} Total %7.2f\{zone[0].area() + zone[1].area() + zone[2].area()}
""";

这样的结果将是如下这样,获得一个整齐的结果:

Description     Width    Height     Area
Alfa 17.80 31.40 558.92
Bravo 9.60 12.40 119.04
Charlie 7.10 11.23 79.73
Total 757.69

关于Java 21中推出的String Templates特性还有很多高级能力,比如:自定义模版处理器等。因为该特性还处于Preview阶段,所以DD也还没有深入研究,仅尝鲜了一下基本功能,如果您对其他高级能力感兴趣,也可以通过官网学习。等该功能正式发布之后,我会在 Java新特性专栏 中更新解读所有内容,欢迎关注与收藏。

欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

前瞻|Java 21 新特性 String Templates(字符串模版)的更多相关文章

  1. Java 8新特性前瞻

    快端午小长假了,要上线的项目差不多完结了,终于有时间可以坐下来写篇博客了. 这是篇对我看到的java 8新特性的一些总结,也是自己学习过程的总结. 几乎可以说java 8是目前为止,自2004年jav ...

  2. Java 8新特性之旅:使用Stream API处理集合

    在这篇“Java 8新特性教程”系列文章中,我们会深入解释,并通过代码来展示,如何通过流来遍历集合,如何从集合和数组来创建流,以及怎么聚合流的值. 在之前的文章“遍历.过滤.处理集合及使用Lambda ...

  3. IBM Developer:Java 9 新特性概述

    Author: 成富 Date: Dec 28, 2017 Category: IBM-Developer (20) Tags: Java (27) 原文地址:https://www.ibm.com/ ...

  4. Java 8 新特性——检视阅读

    Java 8 新特性--检视阅读 参考 Java 8 新特性--菜鸟 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的 ...

  5. Java 8 新特性——实践篇

    Java 8 新特性--实践篇 参考 Java8新特性 重要更新:Lambda 表达式和Stream API Lambda 表达式 Lambda 表达式引入之前: 举个场景例子:当我们要对一个班级里的 ...

  6. Spring 4支持的Java 8新特性一览

    有众多新特性和函数库的Java 8发布之后,Spring 4.x已经支持其中的大部分.有些Java 8的新特性对Spring无影响,可以直接使用,但另有些新特性需要Spring的支持.本文将带您浏览S ...

  7. Java 8新特性探究(八)精简的JRE详解

    http://www.importnew.com/14926.html     首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 - 导航条 - 首页 所有文章 资讯 ...

  8. Java 8 新特性——Lambdas 表达式

    本文内容 引入 测试数据 collect(toList()) map filter flatMap max 和 min reduce 整合操作 参考资料 Java 8 对核心类库的改进主要包括集合类的 ...

  9. Java 8 新特性-Stream更优雅的处理集合入门

    Java 8 新特性之--Stream 一. 简单介绍 Stream是Java 8提出了的一种新的对集合对象功能的增强.它集合Lambda表达式,对集合提供了一些非常便利,高效的操作,使得代码具有非常 ...

  10. [转帖]Java 8新特性探究(八)精简的JRE详解

    Java 8新特性探究(八)精简的JRE详解 https://my.oschina.net/benhaile/blog/211804 精简版的api   撸了今年阿里.网易和美团的面试,我有一个重要发 ...

随机推荐

  1. Serverless冷扩机器在压测中被击穿问题

    一.现象回顾 在今天ForceBot全链路压测中,有位同事负责的服务做Serverless扩容(负载达到50%之后自动扩容并上线接入流量)中,发现新扩容的机器被击穿,监控如下(关注2:40-3:15时 ...

  2. es笔记七之聚合操作之桶聚合和矩阵聚合

    本文首发于公众号:Hunter后端 原文链接:es笔记七之聚合操作之桶聚合和矩阵聚合 桶(bucket)聚合并不像指标(metric)聚合一样在字段上计算,而是会创建数据的桶,我们可以理解为分组,根据 ...

  3. k8s~RKE的方式升级Rancher集群

    kubectl安装 在主机或者远程访问的笔记本上安装kubectl命令行工具 rancher-cluster.yml(RKE配置文件) 通过RKE创建kubernetes集群,需要预先设置ranche ...

  4. [ARM汇编]计算机原理与数制基础—1.1.2 二进制与十进制数制转换

    在计算机中,我们通常使用二进制数制来表示数据,因为计算机的基本电平只有两种状态:高电平(通常表示为 1)和低电平(通常表示为 0).而在我们的日常生活中,我们习惯使用十进制数制.为了方便理解,我们需要 ...

  5. .NET指定图片地址下载并转换Base64字符串

    需求描述 需要调用第三方图片上传接口上传图片,对方图片格式只能接收Base64字符串.所以我们需要将系统服务器的图片通过Url下载下来,然后转换成Base64字符串.接下来我们将使用HttpClien ...

  6. 浅谈OpenCV的多对象匹配图像的实现,以及如何匹配透明控件,不规则图像

    浅谈OpenCV的多对象匹配透明图像的实现,以及如何匹配半透明控件 引子 OpenCV提供的templateMatch只负责将(相关性等)计算出来,并不会直接提供目标的对应坐标,一般来说我们直接遍历最 ...

  7. linux 服务器上如何判断网络是否开通

      项目上由于升级了kafka需要测试下网络是否是通的,因此需要使用命令 nc -zv ip地址 端口这个命令来跑一下网络是否是通的,最后发现是新的kafka的config使用了新的端口,没有开通网络 ...

  8. 记一次etcd全局锁使用不当导致的事故

    1.背景介绍 前两天,现场的同事使用开发的程序测试时,发现日志中报etcdserver: mvcc: database space exceeded,导致 etcd 无法连接.很奇怪,我们开发的程序只 ...

  9. GO web学习(三)

    跟着b站https://space.bilibili.com/361469957 杨旭老师学习做的笔记 路由 Controller / Router 角色 main():设置类工作 controlle ...

  10. 简约版八股文(day1)

    Java基础 面向对象的三大基本特征 封装:将一些数据和对这些数据的操作封装在一起,形成一个独立的实体.隐藏内部的操作细节,并向外提供一些接口,来暴露对象的功能. 继承:继承是指子类继承父类,子类获得 ...