首页 > 编程语言 >Java21的新表达式类型-模板表达式

Java21的新表达式类型-模板表达式

时间:2023-10-29 11:04:44浏览次数:38  
标签:Java21 String 表达式 STR 字符串 模板 处理器

大家好,我是老七,点个关注吧,将持续更新更多精彩内容!

Java21的新表达式类型-模板表达式_Java

在Java编程语言里,模板表达式这个新玩意儿给大家带来了全新的表达式类型。这篇文章会给大家详细讲解模板表达式是什么,如何用它,以及通过具体的代码示例来展示它的优点。

什么是模板表达式

模板表达式是Java21里新出的一个表达式类型。它可以帮助我们用编程的方式连接字符串,这样开发人员就能够安全有效地拼接字符串了。而且,不只是拼接字符串,模板表达式还能将结构化的文本转化成任何东西。

模板表达式语法

模板表达式看起来类似于一个用前缀封闭的字符串。以下代码示例演示了Java中的模板表达式:

String name = "superqi";
String info = STR."My name is \{name}";
System.out.println(info);

//result :My name is superqi

在这个例子里面,我们用一个带有前缀“STR.”的模板表达式。这个模板表达式就像这样组成的:

  1. 模板处理器,比如“STR”,
  2. 点号(就是那个U+002E),跟其他表达式一样,
  3. 还有一段带有点号的文本:“My name is {name}”。

等到了运行的时候,这个模板表达式就会把里面的那些值拼起来,生成一个结果。

所以呢,模板处理器的结果和模板表达式的评估结果通常都是一个字符串,但也不一定就是这样。

STR模板处理器

STR模板处理器是Java里一个用来演示如何使用模板表达式的例子。当然,除了STR之外,还有Freemarker、Thymeleaf等其他可用的模板处理器。

这些模板处理器就像魔法一样,可以让开发人员根据一些特定的规则和逻辑动态地生成文本或其他类型的输出。

比如,STR这个模板处理器,它能在Java平台上工作。它的主要任务是执行字符串插值,意思就是用表达式的值去替换文本中的那些嵌入式表达式。

当我们用STR处理器评估那个模板表达式的时候,最后会得到一个字符串,就像“My name is superqi”这样的结果。

使用模板表达式的示例

以下是使用 STR 模板处理器的更多示例:

示例 1:嵌入式表达式可以是字符串

String firstName = "superqi";
String lastName = "laoqi";
String fullName = STR.format("{0}, {1}", lastName, firstName);
// fullName: "superqi laoqi"
String sortName = STR.format("{0}, {1}", firstName, lastName);
// sortName: "laoqi, superqi"

示例 2:嵌入式表达式可以执行算术运算

int x = 10, y = 20;
String s = STR.format("{0} + {1} = {2}", x, y, x + y);
// s: "10 + 20 = 30"

示例 3:嵌入式表达式可以调用方法和访问字段

String s = STR.format("You have a {0} waiting for you!", getOfferType());
// s: "You have a gift waiting for you!"
String t = STR.format("Access at {0} {1} from {2}", req.date, req.time, req.ipAddress);
// t: "Access at 2023-10-28 15:34 from 127.0.0.1"

使用双引号使重构更容易

用双引号在模板表达式里写,就可以不用点(.)也能转义嵌套表达式。这样一来,嵌套表达式在模板中就像在外部一样呈现,使得字符串连接后转为模板表达式更加简单。

例如:

String filePath = "tmp.dat";
File file = new File(filePath);
String old = "The file " + filePath + " " + (file.exists() ? "does" : "does not") + " exist";
String msg = STR."The file \{filePath} \{file.exists() ? "does" : "does not"} exist";

跨多行使用嵌入式表达式

允许嵌入式表达式在源文件中跨多行意味着嵌入式表达式的值将与字符串中的结果进行连接,而不添加换行符。

String time = STR."The time is \{
    // The java.time.format package is very useful
    DateTimeFormatter
      .ofPattern("HH:mm:ss")
      .format(LocalTime.now())
} right now";
// time: "The time is 12:34:56 right now"

使用多个嵌入表达式

在字符串模板表达式中使用多个嵌入表达式没有限制。与方法调用表达式一样,嵌入式表达式从左到右依次求值。

int index = 0;
String data = STR."\{index++}, \{index++}, \{index++}, \{index++}";
// data: "0, 1, 2, 3"

任何 Java 表达式都可以嵌入。不过,在模板表达式中保持类型安全的同时,不建议使用需要简单的复杂表达式。

模板处理器选项:STR 和 FMT

Java 的基本模板处理器是 STR 和 FMT。STR 执行字符串插值,而 FMT 则将其扩展到字符串插值和自定义格式选项。

String formatted = FMT."The price is: \{price, number, currency}";
// formatted: "The price is: $50.00"

FMT模板处理器可让你拥有更多、更灵活的格式化选择,比如货币、百分比、小数点、指数和布尔值等。这能让你轻松地把数据转化成字符串形式。

安全保证

Java中的模板表达式优先考虑安全性。模板表达式是调用模板处理器的process方法的简写。这种设计可以防止不正确的字符串插值通过程序传播,并确保准确和安全的插值。

模板处理器API

开发人员可以创建自己的模板处理器。自定义模板处理器可以返回任何类型的对象,甚至抛出检查异常。实现StringTemplate。处理器接口允许开发人员处理自定义用例。

创建和执行安全数据库查询

模板表达式简化了数据库查询的安全创建和执行。QueryBuilder示例演示了如何使用模板处理程序来防止SQL注入漏洞。

简化定位

通过将模板映射到资源包,模板处理器可以更容易地处理本地化任务。这种方法使开发人员能够创建模板处理器,自动从资源包中获取本地化字符串,从而使本地化工作更容易、更易于管理。

总之,Java中的模板表达式为安全高效地处理字符串插值和文本生成过程提供了强大的工具。像STR和FMT这样的模板处理器使开发人员能够轻松地创建动态的、本地化的和安全的字符串。创建自定义模板处理器的能力为该特性增加了灵活性和可扩展性,使其成为Java工具箱中用于处理文本和数据的重要补充。


如果各位觉得老七的文章还不错的话,麻烦大家动动小手,

点赞、关注、转发走一波!!

有任何问题可以评论区留言或者私信我,我必将知无不言言无不尽!

标签:Java21,String,表达式,STR,字符串,模板,处理器
From: https://blog.51cto.com/u_16277888/8077521

相关文章

  • Visual Studio 2022 正则表达式
    VisualStudio2022支持使用正则表达式进行搜索和替换操作。在搜索框中,可以点击“正则表达式”按钮来启用正则表达式模式。下面是一些常用的正则表达式示例:匹配数字:\d匹配字母:[a-zA-Z]匹配空格:\s匹配任意字符:.匹配一个或多个字符:+匹配零个或多个字符:*匹配起始位置:^匹配......
  • 常用正则表达式
    一、正则表达式语法1.元字符字符匹配符选择匹配符限定符定位符分组组合和反向引用符元字符(Metacjaracter)-转义号\\\\符号 说明:在我们使用正则表达式去检索某些特殊字符的时候,需要用到转义符号,否则检索不到结果,甚至会报错。特殊:在Java的正则表达式中,两个\\代表其他......
  • 你知道Java21中的顺序集合吗?
    在Java21中,处理集合的方式得到了改进,因为三个新的接口已经融入了现有的类型层次结构。这些顺序集合为我们提供了一个统一的API来访问第一个和最后一个元素,并以相反的顺序处理集合。为了更好地理解顺序集合是什么,让我们回顾一下集合之前的样子。Java集合框架在Java1.2中引入的C......
  • SSTI模板注入学习
    一、前言最近在练ctf的时候遇到了不少模板注入的漏洞,自己对这一块也一直是一知半解的,所以记录一下,对这一块知识也进行一个总结。二、什么是模板注入SSTI(服务器端模板注入)是格式化字符串的一个非常好的例子,如今的开发已经形成了非常成熟的MVC的模式,我们的输入通过V接收,交给......
  • 你知道Java21中的顺序集合吗?
    大家好,我是老七,点个关注吧,将持续更新更多精彩内容!在Java21中,处理集合的方式得到了改进,因为三个新的接口已经融入了现有的类型层次结构。这些顺序集合为我们提供了一个统一的API来访问第一个和最后一个元素,并以相反的顺序处理集合。为了更好地理解顺序集合是什么,让我们回顾一下集合......
  • 正则表达式
     关于正式表达式参考资料:http://events.jianshu.io/p/dc3dfb98dfbb   查找匹配类的规则标识符解释示例^匹配行首 $匹配行末 \<匹配词首 \>匹配词末 ^$匹配空行 \B匹配非边界aajavabb; 用法可以是:\Bjava,java\B,\Bjava\B......
  • 获取Java21所有启动参数及默认值
    各版本获取启动参数命令:java-XX:+PrintFlagsFinal-version>jvm_flags.txt所有参数:[Globalflags]intActiveProcessorCount=-1{product}{default}uintxAdaptiveSizeDecrementScaleFactor......
  • 拉姆达表达式
    拉姆达表达式(LambdaExpression)是一种匿名函数,它允许开发者在代码中快速定义简单的函数。Lambda表达式通常用于简化代码逻辑,特别是在处理集合和流时。Lambda表达式的语法如下:(parameters)->expression其中,`parameters`是参数列表,可以有零个或多个参数;`->`是箭头符号,用于......
  • pytest + yaml 框架 -55. raw 不转义模板语法
    前言在yaml文件中,设置的引用变量语法是${var},最近有小伙伴提到一个需求:请求参数的内容需要有特殊符号${var},希望不被转义,不要引用变量,直接用原始数据即可。raw忽略模板语法Jinja2提供了"raw"语句来忽略所有模板语法。语法示例{%raw%}hello${var}world!{%endraw%......
  • 如何在Excel中实现三联类模板?
    本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前言在一些报表打印应用场景中,会有类似于如下图所示的排版格式:一般情况下将这种类型的需求称为“三联”类型,这种三联需求的关键点在于以下两点:1.......